2016-01-26 35 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