2009-08-05 2 views
47

Я знаю, как использовать функцию substr, но это будет счастливой конец строки наполовину через слово. Я хочу, чтобы строка заканчивалась в конце слова, как я буду делать это? Будет ли это включать регулярное выражение? Любая помощь очень ценится.Удостовериться, что PHP substr заканчивается на слове, а не на символе

Это то, что у меня есть до сих пор. Просто SubStr ...

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

Приветствия

+0

Попробуйте эту ссылку, может помочь вам ... http://stackoverflow.com/a/26098951/3944217 – edCoder

+4

В несвязанной материи, зачем использовать '' $ body'', а не просто '$ body'? – TRiG

ответ

91

Это может быть сделано с помощью регулярных выражений, то, как это будет получить до 260 символов с начала строки до границы слова:

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

В качестве альтернативы вы могли бы использовать функцию wordwrap, чтобы разбить свое тело на линии, а затем просто извлечь первую строку.

+22

downvote! кто-то там ненавидит регулярные выражения! –

+0

Я думаю, что они, возможно, проголосовали за то, что он не использует PHP, который знает. Работает так спасибо. –

+0

Worst-downvote ever-b/c это все еще работает ... 2.5 года спустя – jbnunn

21

Вы можете попробовать это:

$s = substr($string, 0, 261); 
    $result = substr($s, 0, strrpos($s, ' ')); 
+1

Это лучший ответ! В отличие от решения @achshar это решение позволяет сохранить целые слова, не превышающие предел слова. Ключ состоит в том, чтобы использовать функцию 'strrpos' для поиска последнего пробела в первых 261 символах, вернуть эту позицию, а затем разрезать строку в этой позиции с помощью' substr'. Не забудьте включить все это в оператор 'if', чтобы применять функции только в том случае, если текст превышает 260 символов. – RayOnAir

11

Вы можете сделать это: Найти первое пространство от 260-й символа, и использовать его в качестве знака урожая:

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

Спасибо. Работал для меня! – Jason

0
$pos = strpos($body, $wordfind); 
echo substr($body,0, (($pos)?$pos:260)); 
113
substr($body, 0, strpos($body, ' ', 260)) 
+4

Nice, самый компактный вариант – Duncanmoo

+1

Стильное решение, но как насчет UTF-8? –

+3

@ Тони, использующий mb_substr(), сделает трюк для UTF-8. – behz4d

0

Я использую этот раствор:

$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); 
0
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; 
} 
-2
public function Strip_text($data, $size, $lastString = ""){ 
    $data = strip_tags($data);   
    if(mb_strlen($data, 'utf-8') > $size){ 
     $result = mb_substr($data,0,mb_strpos($data,' ',$size,'utf-8'),'utf-8'); 
      if(mb_strlen($result, 'utf-8') <= 0){ 
      $result = mb_substr($data,0,$size,'utf-8'); 
      $result = mb_substr($result, 0, mb_strrpos($result, ' ','utf-8'),'utf-8');;   
     } 
     if(strlen($lastString) > 0) { 
      $result .= $lastString; 
     } 
    }else{ 
    $result = $data; 
    } 
    return $result; 
} 

Передать строку в Funtion Strip_text ("Длинный текст с HTML тега или без HTML тега", 15) Тогда эта функция будет возвращать первый 15 символов из строки html без тегов html. Если строка меньше 15 символов, то верните полную строку другой мудрый, она вернет символ 15 с строкой параметра $ lastString.

Пример:

Strip_text("<p>vijayDhanasekaran</p>", 5) 

Результат: Виджей

Strip_text("<h1>vijayDhanasekaran<h1>",5,"***....") 

Результат: Виджей *** ....

+1

Может быть полезно немного больше контекста или объяснения: как это работает, почему этот метод и т. Д. – achedeuzot

+0

Вы можете получить подстроку без несвязанных символов, когда вы вводите шрифты utf-8 ex «Tamil». – vijay

-1

Попробуйте Эта функция ..

<?php 
/** 
* trims text to a space then adds ellipses if desired 
* @param string $input text to trim 
* @param int $length in characters to trim to 
* @param bool $ellipses if ellipses (...) are to be added 
* @param bool $strip_html if html tags are to be stripped 
* @param bool $strip_style if css style are to be stripped 
* @return string 
*/ 
function trim_text($input, $length, $ellipses = true, $strip_tag = true,$strip_style = true) { 
    //strip tags, if desired 
    if ($strip_tag) { 
     $input = strip_tags($input); 
    } 

    //strip tags, if desired 
    if ($strip_style) { 
     $input = preg_replace('/(<[^>]+) style=".*?"/i', '$1',$input); 
    } 

    if($length=='full') 
    { 

     $trimmed_text=$input; 

    } 
    else 
    { 
     //no need to trim, already shorter than trim length 
     if (strlen($input) <= $length) { 
     return $input; 
     } 

     //find last space within length 
     $last_space = strrpos(substr($input, 0, $length), ' '); 
     $trimmed_text = substr($input, 0, $last_space); 

     //add ellipses (...) 
     if ($ellipses) { 
     $trimmed_text .= '...'; 
     }  
    } 

    return $trimmed_text; 
} 
?> 
+1

PLS проголосовать за избирателя ... – edCoder

1

wordwrap и explode, то сначала элемент массива вы хотите $wr=wordwrap($text,20,':'); $strs=explode(":",$wr); $strs[0]

0

Как насчет этого?

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