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
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 表达式必须是可修改的左值
  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)
  • ¥50 mac mini外接显示器 画质字体模糊
  • ¥15 TLS1.2协议通信解密
  • ¥40 图书信息管理系统程序编写
  • ¥20 Qcustomplot缩小曲线形状问题