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

时间:2017-08-28 06:52:17

标签: php regex preg-replace preg-match

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

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

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

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

我需要转:

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

成:

Ok!
Really?
I guess.

使用一种正则表达式。

2 个答案:

答案 0 :(得分:6)

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

([?!.])\1+

替换为$1

请参阅regex demo.

<强>详情

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

PHP demo

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

结果:

Ok!
Really?
I guess.

答案 1 :(得分:0)

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

 pattern ([!?.]){2,}

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

这种模式似乎也很好用。