我正在尝试使用省略号(...)来缩短详细描述,并希望具有单词边界。
这是我当前的代码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,…
。我希望在省略号之前删除最后一个单词之后的标点符号。
帮助?
这是您的固定方法:
$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演示
正如我在评论中指出的那样,您可以匹配标点符号(可选地,带有\p{P}*
),但是我忘记了它\b
可以匹配尾随和前导词的边界。通过\b
使用负的超前限制(?!\w)
(例如(?!\w)\b
)来限制,我们仅匹配尾随单词边界。
此外,将捕获组((...)
)添加到模式中,以便我们仅将修剪了尾部标点符号的字符串捕获到组1中,并且可以使用来访问该值$match[1]
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句