【问题标题】:How to match with regex all special chars except "-" in PHP?如何与正则表达式匹配PHP中除“-”之外的所有特殊字符?
【发布时间】:2012-04-01 09:30:03
【问题描述】:

如何匹配除 PHP 中的字符 - 之外的所有“特殊”字符(如 +_*&^%$#@!~)?

我知道\W 将匹配所有“特殊”字符,包括-

关于 Unicode 字母有什么建议吗?

【问题讨论】:

  • 特殊字符,如 +_)(*&^%$#@!~,不是任何语言...

标签: php regex unicode special-characters non-alphanumeric


【解决方案1】:
  • \pL 匹配任何具有 Unicode Letter 字符属性的字符,这是一个大的通用类别组;也就是说,它匹配[\p{Ll}\p{Lt}\p{Lu}\p{Lm}\p{Lo}]
  • \pN 匹配任何具有 Unicode Number 字符属性的字符,这是一个主要的通用类别组;也就是说,它匹配[\p{Nd}\p{Nl}\p{No}]
  • 请注意,Unicode Alphabetic 字符属性还包括某些组合标记,例如 U+0345 ◌ͅ ᴄᴏᴍʙɪɴɪɴɢ ɢʀᴇᴇᴋ ʏᴘᴏɢᴇɢʀᴀᴍᴍᴇɴɪ。我建议你还包括\pM,它匹配任何具有Unicode Mark 字符属性的字符,这是一个主要的通用类别组;也就是说,它匹配[\p{Mn}\p{Me}\p{Mc}]
  • 字符 U+002D ʜʏᴘʜᴇɴ-ᴍɪɴᴜꜱ 可能是您所指的-
  • 请注意,尽管 Unicode v6.1 有 27 个字符,具有 Unicode Dash 字符属性,包括 U+2010 ʜʏᴘʜᴇɴ、U+2013 ᴇɴ ᴅᴀꜱʜ、U+2014 ᴇᴍ ᴅᴀꜱʜ等常见字符, 和 U+2212 ᴍɪɴᴜꜱ ꜱɪɢɴ。不管你是真的想包括还是排除那些,我不知道。

考虑到所有这些,您不太可能想要这样的东西:

[^\pL\pN\pM\x2D\x{2010}-\x{2015}\x{2212}]

【讨论】:

    【解决方案2】:
    • [^-] 不是你想要的特殊字符
    • [\W] 都是你知道的特殊字符
    • [^\w] 也是特殊字符 - 听起来公平吗?

    因此[^\w-] 是两者的组合:所有“特殊”字符但没有-

    【讨论】:

    • 也可以,谢谢,由于某种原因它与 _ 字符不匹配...但我设法绕过了它,
    • 您认为[\W] 会做什么而\W 不会?
    • @tchrist:你什么意思,我不这么认为。
    • 为什么要在单个字符类缩写周围加上方括号?
    • 您似乎将_ 之类的东西误分类为非特殊,将àéüîøçñ 之类的东西误分类为一半-special,以及像‾ΑΒK5 这样的东西作为special。这根本没有意义。
    【解决方案3】:

    你可以试试这个模式

    ([^a-zA-Z-])

    这应该匹配所有不是a-z- 的字符

    【讨论】:

    • 不好,因为unicode中可以有字母……总之,找到答案了! [^\p{L}-\d]
    • 考虑到您的问题非常广泛,没有特定的字符集范围,所以这是我的假设。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多