web-dev-qa-db-ja.com

PHP substrが文字ではなくWordで終了することを確認する

Substr関数の使用方法は知っていますが、Wordの途中で文字列を終了させることができます。文字列をWordの最後で終了させたいのですが、どうすればよいでしょうか?正規表現が含まれますか?どんな助けも大歓迎です。

これは私がこれまで持っているものです。ただSubStr ...

echo substr("$body",0,260);

乾杯

54
Cool Hand Luke

これは正規表現で行うことができます。このようなものは、文字列の先頭からWordの境界までで最大260文字になります。

$line=$body;
if (preg_match('/^.{1,260}\b/s', $body, $match))
{
    $line=$match[0];
}

または、 wordwrap 関数を使用して$ bodyを行に分割し、最初の行を抽出することもできます。

96
Paul Dixon
substr($body, 0, strpos($body, ' ', 260))
128
Achshar

これを試すことができます:

   $s = substr($string, 0, 261);
   $result = substr($s, 0, strrpos($s, ' '));
29
Zed

これを行うことができます:260番目の文字から最初のスペースを見つけて、それをクロップマークとして使用します。

$pos = strpos($body, ' ', 260);
if ($pos !== false) {
    echo substr($body, 0, $pos);
}
12
Gumbo
function substr_Word($body,$maxlength){
    if (strlen($body)<$maxlength) return $body;
    $body = substr($body, 0, $maxlength);
    $rpos = strrpos($body,' ');
    if ($rpos>0) $body = substr($body, 0, $rpos);
    return $body;
}
1
Sanne

wordwrapとexplodeその後、最初の配列要素が必要です$wr=wordwrap($text,20,':'); $strs=explode(":",$wr); $strs[0]

1

私はこのソリューションを使用します:

$maxlength = 50;
substr($name, 0, ($spos = strpos($name, ' ', $lcount = count($name) > $maxlength ? $lcount : $maxlength)) ? $spos : $lcount );

またはインライン:

substr($name, 0, ($spos = strpos($name, ' ', $lcount = count($name) > 50 ? $lcount : 50)) ? $spos : $lcount );
1
Oleksandr Knyga

これはどうですか?

/**
 * @param string $text
 * @param int $limit
 * @return string
 */
public function extractUncutPhrase($text, $limit)
{
    $delimiters = [',',' '];
    $marks = ['!','?','.'];

    $phrase = substr($text, 0, $limit);
    $nextSymbol = substr($text, $limit, 1);


    // Equal to original
    if ($phrase == $text) {
        return $phrase;
    }
    // If ends with delimiter
    if (in_array($nextSymbol, $delimiters)) {
        return $phrase;
    }
    // If ends with mark
    if (in_array($nextSymbol, $marks)) {
        return $phrase.$nextSymbol;
    }

    $parts = explode(' ', $phrase);
    array_pop($parts);

    return implode(' ', $parts); // Additioanally you may add ' ...' here.
}

テスト:

public function testExtractUncutPhrase()
{
    $stringUtils = new StringUtils();

    $text = 'infant ton-gue could make of both names nothing';
    $phrase = 'infant';

    $this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 11));
    $this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 12));

    $text = 'infant tongue5';
    $phrase = 'infant';

    $this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 13));
    $this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 11));
    $this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 7));
}

public function testExtractUncutPhraseEndsWithDelimiter()
{
    $stringUtils = new StringUtils();

    $text = 'infant tongue ';
    $phrase = 'infant tongue';

    $this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 13));

    $text = 'infant tongue,';
    $phrase = 'infant tongue';

    $this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 13));
}

public function testExtractUncutPhraseIsSentence()
{
    $stringUtils = new StringUtils();

    $text = 'infant tongue!';
    $phrase = 'infant tongue!';

    $this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 14));
    $this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 100));

    $text = 'infant tongue!';
    $phrase = 'infant tongue!';

    $this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 13));

    $text = 'infant tongue.';
    $phrase = 'infant tongue.';

    $this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 13));
}
0
$pos = strpos($body, $wordfind);
echo substr($body,0, (($pos)?$pos:260));
0
andres descalzo