web-dev-qa-db-fra.com

S'assurer PHP soustr finit sur un mot pas un caractère

Je sais comment utiliser la fonction substr mais cela mettra fin à une chaîne au milieu d'un mot. Je veux que la chaîne se termine à la fin d'un mot, comment pourrais-je m'y prendre? Cela impliquerait-il une expression régulière? Toute aide est très appreciée. 

C'est ce que j'ai jusqu'ici. Juste le SubStr ...

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

À votre santé

50
Cool Hand Luke

Cela pourrait être fait avec une regex, quelque chose comme ceci aura jusqu'à 260 caractères du début de la chaîne jusqu'à une limite de Word:

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

Vous pouvez également utiliser la fonction wordwrap pour séparer votre $ corps en lignes, puis extraire simplement la première ligne.

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

Vous pouvez essayer ceci:

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

Vous pouvez faire ceci: Trouvez le premier espace à partir du 260ème caractère et utilisez-le comme marque de recadrage:

$pos = strpos($body, ' ', 260);
if ($pos !== false) {
    echo substr($body, 0, $pos);
}
12
Gumbo

wordwrap et exploser, le premier élément du tableau est celui que vous voulez $wr=wordwrap($text,20,':'); $strs=explode(":",$wr); $strs[0]

1

J'utilise cette solution:

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

Ou en ligne:

substr($name, 0, ($spos = strpos($name, ' ', $lcount = count($name) > 50 ? $lcount : 50)) ? $spos : $lcount );
1
Oleksandr Knyga
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;
}
0
Sanne

Et ça?

/**
 * @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.
}

Tests:

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