在换行符前或后删除三个点

3

我使用这个函数来删除换行符之前或之后的三个点:

private function trimThreeDots(string $text): string {
    $threeDotsAtTheBeginning = '((^|[\n]{1})[\\.]{3})';
    $threeDotsAtTheEnd = '([\\.]{3}[\n]{1})';

    $pattern = '/' . $threeDotsAtTheBeginning . '|' . $threeDotsAtTheEnd . '/';

    return preg_replace_callback($pattern, function ($str) {
        return str_replace("...", "", $str[0]);
    }, $text);
}

除了这种情况外,它是有效的,即如果我有一个像这样的字符串:

"Bla bla bla...
...bla bla bla"

我只得到了一个匹配项。但是我想要获得两个匹配项,因为我需要删除三个点的所有出现。我想知道是否有更直接和高效的写法来编写这个正则表达式,并在上述情况下获得两个匹配项?


你不需要正则表达式,只需在 str_replace() 源字符串中放置换行符即可。 - Alex Howansky
没有正则表达式,我会考虑按行分割,去除点号(使用 trim() 函数),必要时再重新连接。 - Andy G
@AndyG trim()方法不适用于此任务。第二个参数应该是一个包含要去除的字符列表。请参见 此链接 - Cid
该列表可能只包含一个字符,即点。 - Andy G
这将删除任意数量的前导/尾随点。尝试使用 echo trim("bla bla bla.......", '.'); - Cid
@Cid 是的,我只是假定了一串点,没有强调需要显式地删除其中三个。但我并不一定试图提出另一种解决方案,只是评论正则表达式可能对这样的任务来说有些过头了。 - Andy G
3个回答

5

您可以使用

$s = "Bla bla bla...
...bla bla bla";
echo preg_replace('~(?:\.{3})?(\R)(?:\.{3})?~', '$1', $s);

请查看PHP演示正则表达式演示

详细信息

  • (?:\.{3})? - 一个可选的三个点的序列
  • (\R) - 第一组:任何换行序列
  • (?:\.{3})? - 一个可选的三个点的序列

替代字符串$1用匹配到的确切换行序列来取代匹配结果。


不需要“\h*”,因为我不会在换行符之前或之后删除三个点,但其他部分都没问题,谢谢。 - Ramy Al Zuhouri
@RamyAlZuhouri,那么为什么在您的 '([\\.]{3}[\s]*[\n]{1})' 模式中使用 \s* 呢?好的,既然这是您的模式错误,我已经删除了 \h* 部分。 - Wiktor Stribiżew

2
您可以使用正则表达式 \.{3}(?=\n)|(?<=\n)\.{3}
  • \.{3}(?=\n) 匹配换行符在点号后面的情况。

  • (?<=\n)\.{3} 匹配换行符在点号前面的情况。

演示。


PHP:

preg_replace('~\.{3}(?=\n)|(?<=\n)\.{3}~', '', $s);

0

看起来可能过于复杂了? 这个怎么样?

$re = '/(^\.{3}|\.{3}$)/gm';
$str = 'Bla bla bla...
...bla bla bla';
$subst = '';

$result = preg_replace($re, $subst, $str);

echo "The result of the substitution is ".$result;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接