我使用此功能删除换行符之前或之后的三个点:
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"
我只有一场比赛。但是我想得到两个匹配项,因为我需要删除两个出现的三个点。我想知道是否可能有一种更直接有效的方法来编写此正则表达式并在上述情况下获得两次匹配?
答案 0 :(得分:5)
您可以使用
$s = "Bla bla bla...
...bla bla bla";
echo preg_replace('~(?:\.{3})?(\R)(?:\.{3})?~', '$1', $s);
请参见PHP demo和regex demo。
详细信息
(?:\.{3})?
-3个点的可选序列(\R)
-第1组:任意换行序列(?:\.{3})?
-3个点的可选序列 $1
替换项将匹配项替换为正则表达式匹配的确切换行顺序。
答案 1 :(得分:2)
您可以使用RegEx \.{3}(?=\n)|(?<=\n)\.{3}
\.{3}(?=\n)
匹配换行符在点后的情况
(?<=\n)\.{3}
匹配换行符在点之前的情况
preg_replace('~\.{3}(?=\n)|(?<=\n)\.{3}~', '', $s);
答案 2 :(得分: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;