duankeng1911 2015-01-14 20:12
浏览 251
已采纳

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

Is there an efficient way to replace all duplicate non-alphanumeric characters with single characters?

This question forces one to be explicit about the punctuation characters:

PHP - Removing Duplicate Punctuation?

Like so:

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

Is it possible to achieve the same result but for ALL non-alphanumeric characters without explicitly referencing them by name?

Here's a use case:

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

to

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

UPDATE

Unfortunately the above cuts too deep in one use case: http://. How can one keep double / for urls (or simply when they follow :), but not allow regular repeat / or even more than 2 / after a :. Here is a single use case:

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

becomes:

My /favorite/ site is http://example.com!
  • 写回答

1条回答 默认 最新

  • dscw1223 2015-01-14 20:19
    关注

    You can use:

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

    RegEx Demo

    • [^\p{L}\p{N}] - Match anything but unicode alphanumeric character
    • (?<!:) - Match only if not precede by : to take care of http://...
    • ([^\p{L}\p{N}]) - Capture above in a group #1 for back-reference
    • \1+ - Match one or more of captured group #1, thus making sure 2 or more of same non-alphanumeric is matched
    • Replace it by $1 i.e. the captured non-alphanumeric character
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样