PHP 正则表达式将重复字符减少为单个实例

PHP Regex reduce a repeated character to a single instance

我想去除文本中重复的感叹号 (!!!)、问号 (??) 或句号 (....),并将它们替换为它们自身的单个实例。所以我基本上需要"one preg_replace to rule them all"。

我目前正在执行三个不同的模式:

preg_replace("/[!]{2,}/","!", $str);
preg_replace("/[?]{2,}/","?", $str);
preg_replace("/[.]{2,}/",".", $str);

有没有一种方法可以仅使用一个正则表达式模式将找到的字符替换为其自身的单个实例?

我需要转:

Ok!!!
Really????
I guess.....

进入:

Ok!
Really?
I guess.

使用一种正则表达式模式。

使用带反向引用的捕获组:

([?!.])+

替换为</code>。</p> <p>查看 <a href="https://regex101.com/r/Cp7XSV/2" rel="noreferrer">regex demo.</a> </p> <p><strong>详情</strong></p> <ul> <li><code>([?!.]) - 将单个字符匹配并捕获到组 1 中:?!.

  • + - 匹配第 1 组中捕获的内容的一个或多个实例。
  • PHP demo:

    $str = "Ok!!!\nReally????\nI guess.....";
    $res = preg_replace('/([?!.])+/', '', $str);
    echo $res;
    

    结果:

    Ok!
    Really?
    I guess.
    

    为了完成,我想我 post 在查看另一个人给出的答案后,我会根据我的原始代码自己的答案。

     pattern ([!?.]){2,}
    
     preg_replace('/([!?.]){2,}/','', $str);
    

    这个模式似乎也能正常工作。