2016-01-26 37 views
2

我試圖用省略號(…)來縮短長描述並希望有字邊界。字符邊界後的某些數字或字符後的省略號

這裏是我當前的代碼eval.in

# Assume $body is a long text. 
$line = $body; 
if(strlen($body) > 300 && preg_match('/^.{1,300}\b/su', $body, $match)) { 
    $line = trim($match[0]) . "…"; 
} 
echo $line; 

其實,這工作得很好,我喜歡它除了有當字邊界具有後一個標點符號倍。

如果我使用上面的代碼,我得到的結果如下所示:

This is a long description…I have punctuations,…。我希望在放棄省略號之前在最後一個字之後刪除標點符號。

幫助?

+0

嘗試使用'/ ^(。{1,300})\ b \ p {P} */su''匹配尾部標點並僅使用trim($ match [1])。 「…」;'。 –

+1

只使用wordwrap –

+0

@WiktorStribiżew沒有工作 - [eval.in](https://eval.in/508404) –

回答

1

這裏是後加上ellipsis你的修復ED的方法:

$body = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam eu congue ex. Nunc sem arcu, fermentum vel feugiat quis, consequat nec enim. Quisque et pulvinar velit, et laoreet justo. Integer quis sapien ac turpis mattis lobortis at at metus. Vestibulum euismod turpis odio, id luctus quam pharetra, at, et. Sed finibus, nunc at ultricies posuere, dui mauris aliquet quam, eget aliquet ligula libero a turpis. Pellentesque eu diam sodales, sollicitudin leo et, sagittis magna. Donec feugiat, velit quis condimentum porttitor, enim sapien varius elit, sit amet pretium risus turpis vitae massa. Sed ac ligula sit amet lorem scelerisque tristique a id ex. Nullam maximus tincidunt magna, vel molestie lectus tempus non. Sed euismod placerat ultricies. Morbi dapibus augue ut odio faucibus, vel maximus nisl pharetra. Aliquam hendrerit dolor in ipsum pharetra, eget tincidunt lacus ultrices."; 

$line = $body; 
if(strlen($body) > 300 && preg_match('/^(.{1,300})(?!\w)\b\p{P}*/su', $body, $match)) { 
    $line = trim($match[1]) . "…"; 
} 
echo $line; 

eval.in demo

正如我在評論中指出,可以匹配標點符號(可選,與\p{P}*),但我忘了\b可以同時匹配尾隨領先字邊界。通過限制\b的負向預測(?!\w)(如(?!\w)\b)我們只匹配尾隨字邊界。

此外,捕獲組((...))被添加到圖案,使得我們只捕獲成1組字符串以尾隨標點符號修剪出來,並且該值可以與$match[1]被訪問。

+1

這是完美的,謝謝! –

1

您可以使用:

$body = preg_replace('/^(.{0,299}\w)\b.*/su', '$1…', $body); 

\w之前\b確保我們don'e非單詞字符

+0

我寄予厚望但這沒有奏效。 [eval.in](https://eval.in/508396) –

+0

爲什麼給我3組省略號?我希望它在'pharetra ...'後結束。我不想讓其他人接受。 –

+0

好吧再次檢查更新的答案 – anubhava