某些数字或带有单词边界的字符后的省略号

Ellipsis After Certain Number or Characters with Word Boundaries

我正在尝试添加省略号 (…) 来缩短长描述并希望有单词边界。

这是我当前的代码 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 = preg_replace('/^(.{0,299}\w)\b.*/su', '…', $body);

\w\b 之前确保我们不会在 non-word 字符

之后添加 ellipsis

这是您的固定方法:

$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 可以匹配尾随的 前导词边界。通过使用负前瞻 (?!\w)(如 (?!\w)\b)限制 \b,我们只匹配 trailing 字边界。

此外,捕获组 ((...)) 被添加到模式中,这样我们只 捕获 到第 1 组中,删除尾随标点符号的字符串,以及可以使用 $match[1].

访问值