【问题标题】:Handle unicode while removing/replacing non-word characters在删除/替换非单词字符时处理 unicode
【发布时间】:2016-10-28 11:42:34
【问题描述】:

我想从包含 unicode(非 ASCII)字符的字符串中删除标点符号和符号(通常是非单词字符)。

例如New $OrléansNew OrléansNewOrléans(如果删除了空格)

到目前为止我遇到的方法使用\W\w(参见PHP strip punctuation

我面临的挑战是保留 unicode。如果我使用\WÎ 上的Île-de-France 将被删除/替换:

preg_replace('/\W+/', "-", 'Île-de-France')-le-de-France

是否可以删除非单词字符并仍然处理作为单词字符的非 ASCII 字符?

谢谢。

【问题讨论】:

  • 使用'/[^\p{M}\w]+/u'
  • 如果您需要使用组合标记,请使用我的建议。否则,您的问题是重复的,因为这里有很多关于 \u 修饰符的类似问题。
  • @WiktorStribiżew 使用\u 可以解决问题。我已经看过\u,但不知道它是干什么用的。我还在一个使用character classes 而不是POSIX 的示例上进行了尝试,但它失败了。解决方案看起来很简单,但在搜索中没有直接的线索。可能您可以发表评论作为答案。它可以帮助某人。

标签: php regex string unicode preg-replace


【解决方案1】:

如果您在删除非单词字符时需要最安全的正则表达式来处理 Unicode 字母,请使用

'/[^\p{M}\w]+/u'

regex demo

关键是无论如何你需要/u修饰符(使PCRE引擎将模式和字符串视为Unicode字符串),而\W不匹配组合标记

如果您不需要担心组合标记,您可以使用'/\W+/u' regex 删除非单词字符。

另外,请参阅/u modifier reference

u (PCRE_UTF8)
此修饰符打开与 Perl 不兼容的 PCRE 的附加功能。模式和主题字符串被视为 UTF-8。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 2017-07-26
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    相关资源
    最近更新 更多