2012-04-13 158 views
3

我發現這個PHP腳本:分割字符串PHP

//帶標籤,以避免破壞任何HTML $字符串= 用strip_tags($字符串);

如果(strlen的($字符串)> 500){

// truncate string 
$stringCut = substr($string, 0, 500); 

// make sure it ends in a word so assassinate doesn't become ass... 
$string = substr($stringCut, 0, strrpos($stringCut, ' ')).'... <a href="/this/story">Read More</a>'; } echo $string; 

通過webbiedave創建。現在我的問題是我如何在strrpos中指定空間或點?

所以,如果我限制串22,如果我有這樣的事情計算器是最好的網站不斷 - >將輸出的StackOverflow是......如果我有這樣的事情http://stackoverflow.com是最好的網站不斷 - >將輸出只...因爲他沒有找到空間和字符串長度> 22。如果在字符串中找到一個點,如何修改此腳本以剪切文本,因此http://stackoverflow.com是有史以來最好的網站 - >成爲http://stackoverflow ...?

回答

1

竟被我d從結尾檢查字符串,原因您需要刪除不完整的單詞。該不完整單詞的條件是當短字符串不以空格結尾或結尾字符如'!'時或者只是點。接下來的cond就是看字符串結束後是否+1符號也是這樣的字符。如果是這樣的話,你只需要刪除從最後到下一個空格的任何字符。這可以通過正則表達式來完成(類似於/ [:alfa] + $ /的東西,似乎要好得多)。

這是一個簡單的方法來做基本的事情,但我認爲一個好的開始。

實例的可能是什麼?

function word_wrap_custom($string, $limit){ 
$oneWord = explode(' ', $string); 
if(count($oneWord) < 2) 
    return $oneWord[0]; 
$string = substr($string, 0, $limit + 2); 

$endchar = substr($string, $limit, $limit + 1); 

$postendchar = substr($string, $limit + 1, $limit + 2); 

$arrAccetpEndChar = array(' ', '!', '?', ',', '.', ';', ':'); 

if(in_array($postendchar, $arrAccetpEndChar) || in_array($endchar, $arrAccetpEndChar)) 
{ 
    return $string; 
} 
else 
{ 
    return preg_replace('/[A-Za-z0-9]+$/', '', $string); 
} 
} 
+0

你的答案似乎是最好的:)但我是一個在PHP的begginer ...你能翻譯你說的在PHP代碼中的? – TGeorge 2012-04-13 09:10:50

+0

上面貼的代碼。你將不得不對它進行編輯,以便完成你想要的功能。如果您有任何問題,請詢問。 – 2012-04-13 09:59:55

+0

這是工作,但你的代碼有一個bug。如果我沒有空間它只會輸出...閱讀更多 如果我有像 echo word_wrap_custom(「Stackoverflow」,「22」);?>將只輸出...閱讀更多,如果我把preg_replace('/ [A-Za-z0-9] + $ /','... read more',$ string);我們該如何解決這個問題? – TGeorge 2012-04-13 10:15:07

2

如果您想在不破壞單詞的情況下進行拆分,但在尊重線條限制的情況下,請使用wordwrap而不是其他任何拆分方法。

$longText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse ut purus a tellus ultrices vulputate. Aliquam posuere facilisis elit ut adipiscing. Nunc auctor dignissim porta. Vestibulum vitae tempor augue. Nam vel odio quis quam gravida ultrices sed a arcu. Phasellus nec odio massa. Duis imperdiet rutrum mi, vitae volutpat nulla convallis quis. Donec dignissim pulvinar mauris id molestie. Duis id mauris augue, id sagittis velit. Ut justo lectus, scelerisque egestas tempor et, facilisis vitae erat. Quisque ut mattis nulla. Donec a justo quis nisi tempus ultrices. Phasellus non dui non dolor tristique tincidunt vitae imperdiet libero. Pellentesque pretium luctus sem."; 

$makeLine = wordwrap($longText, 50, PHP_EOL); 

echo $makeLine; 

前後:http://codepad.org/Dqz8qzAy

如果你只是想在第一行,也許作爲一個摘要文本,你可能會爆炸所產生的字符串,第一個結果出所得陣列的轉移:

$longText = "..."; 

$makeLine = wordwrap($longText, 50, '\r\n'); 
$firstSen = array_shift(explode('\r\n', $makeLine)); 

echo $firstSen; // Lorem ipsum dolor sit amet, consectetur adipiscing... 
0

這對不會打破的話:

function ShortenText($text, $chars) 
{ 
    $chars = $chars;$text = $text." "; 
    $countchars = strlen($text); 
    if($countchars > $chars) 
    { 
     $text = substr($text,0,$chars); 
     $text = substr($text,0,strrpos($text,' ')); 
     $text = $text."..."; 
    } 
    return $text; 
} 
+0

你的代碼不相同,一個由me.So發佈,如果我有 將輸出StackOverFlow是...如果我有 <?php回聲ShortenText(」http://stackoverflow.com是有史以來最好的網站「,」22「);?>將只輸出...因爲他在前22個字符中找不到空格。所以我想要搜索點或空間。 – TGeorge 2012-04-13 09:46:24