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

Php 在换行符之后或之前删除三个点,php,regex,Php,Regex,我使用此函数删除换行前后的三个点: private function trimThreeDots(string $text): string { $threeDotsAtTheBeginning = '((^|[\n]{1})[\\.]{3})'; $threeDotsAtTheEnd = '([\\.]{3}[\n]{1})'; $pattern = '/' . $threeDotsAtTheBeginning . '|' . $threeDotsAtTheEnd .

我使用此函数删除换行前后的三个点:

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"
我只有一根火柴。但是我想得到两个匹配项,因为我需要删除三个点的两个匹配项。我想知道是否有一种更直接有效的方法来编写这个正则表达式,并在上述情况下获得两个匹配项?

您可以使用

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

详细信息

  • (?:\.{3})
    -3个点的可选序列
  • (\R)
    -第1组:任何换行顺序
  • (?:\.{3})
    -3个点的可选序列
$1
替换使用正则表达式匹配的确切换行顺序替换匹配项。

您可以使用正则表达式

  • \.{3}(?=\n)
    匹配换行符在点之后的情况


  • (?似乎太复杂了,也许吧?
    这个怎么样

    $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;
    

    您不需要正则表达式,只需将新行字符放在<代码> StryRePoT()/Case>源字符串中。没有ReGEX,我会考虑分割成行,<代码> Times()/代码>点,必要时重新连接。@ ANDYG <代码>三()
    无法完成此任务。第二个参数是要修剪的字符列表。请参见列表中可能只包含一个字符,一个点。这将删除任何数量的前导/尾随点。请尝试此
    回显修剪(“bla-bla-bla…,”);
    不需要“\h*”因为我不会删除这三个点,以防换行后或换行前有空格。但其余的都可以,谢谢。@RamyAlZuhouri那么为什么要在你的
    '([\\.]{3}[\s]*[\n]{1})
    模式中使用
    \s*
    呢?好的,既然这是你的模式错误,我删除了
    \h*
    部分。
    $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;