PHP Regex将重复的字符减少为单个实例

Has*_*sen 4 php regex preg-replace preg-match

我想删除重复感叹号(!!!),问号(??)或句号(....)的文本,并用自己的单个实例替换它们.所以我基本上需要"一个preg_replace来统治它们".

我目前有三个独立的模式正在执行:

preg_replace("/[!]{2,}/","!", $str);
preg_replace("/[?]{2,}/","?", $str);
preg_replace("/[.]{2,}/",".", $str);
Run Code Online (Sandbox Code Playgroud)

有没有办法用一个正则表达式模式用一个单独的实例替换找到的字符?

我需要转:

Ok!!!
Really????
I guess.....
Run Code Online (Sandbox Code Playgroud)

成:

Ok!
Really?
I guess.
Run Code Online (Sandbox Code Playgroud)

有一个正则表达式模式.

Wik*_*żew 6

使用具有反向引用的捕获组:

([?!.])\1+
Run Code Online (Sandbox Code Playgroud)

替换为$1.

请参阅正则表达式演示.

细节

  • ([?!.])-比赛和捕捉到第1组的单个字符:?,!.
  • \1+ - 匹配捕获到组1中的一个或多个内容实例.

PHP演示:

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

结果:

Ok!
Really?
I guess.
Run Code Online (Sandbox Code Playgroud)