如何用PHP中的单个标点符号替换所有重复的标点符号?

时间:2015-01-14 20:12:41

标签: php regex preg-replace

是否有一种有效的方法可以用单个字符替换所有重复的非字母数字字符?

这个问题强迫人们明确标点字符:

PHP - Removing Duplicate Punctuation?

像这样:

$str = preg_replace('~[?!]{2,}~', '?', preg_replace('~([.,!?])(\\1+)~', '\\1', $str));

是否可以实现相同的结果但是对于所有非字母数字字符而没有明确地按名称引用它们?

这是一个用例:

Hello...  how   are you!!??  I''m bored!!----!!!&&&&&^^^^%%%(()))((<<<<<

Hello. how are you!? I'm bored!-!&^%()(<

更新

不幸的是,在一个用例中,上面的内容过于深入:http://。如何为网址保留双倍/(或仅在他们关注:时),但在{{1}后不允许定期重复/或甚至超过2 / }}。这是一个用例:

:

变为:

My ////favorite//// site is http://///example.com!!!!!!!

1 个答案:

答案 0 :(得分:5)

您可以使用:

$str = preg_replace('~((?<!:)[^\p{L}\p{N}])\1+~u', '$1', $str);
//=> Hello. how are you!? I'm bored!-!&^%()(<

RegEx Demo

  • [^\p{L}\p{N}] - 匹配除unicode字母数字字符之外的任何内容
  • (?<!:) - 仅在不在:之前进行匹配才能照顾http://...
  • ([^\p{L}\p{N}]) - 在组#1中捕获以上用于反向引用
  • \1+ - 匹配一个或多个捕获的组#1,从而确保两个或更多相同的非字母数字匹配
  • 将其替换为$1,即已捕获的非字母数字字符