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

How can I replace all duplicate punctuation with single punctuation in PHP?

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

这道题迫使人们明确标点符号:

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://。如何让 url 保持双倍 /(或者只是当它们跟随 : 时),但不允许在 [=18] 之后定期重复 / 甚至超过 2 / =].这是一个用例:

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

变为:

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

您可以使用:

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

RegEx Demo

  • [^\p{L}\p{N}] - 匹配除 unicode 字母数字字符以外的任何字符
  • (?<!:) - 仅当前面没有 : 时才匹配以照顾 http://...
  • ([^\p{L}\p{N}]) - 在组 #1 中捕获上面的内容以供反向参考
  • + - 匹配捕获组 #1 中的一个或多个,从而确保匹配 2 个或更多相同的非字母数字
  • 替换为即捕获的非字母数字字符