如何与regex匹配所有特殊字符,但“除外”-&引用;在PHP中?

如何与regex匹配所有特殊字符,但“除外”-&引用;在PHP中?,php,regex,unicode,special-characters,non-alphanumeric,Php,Regex,Unicode,Special Characters,Non Alphanumeric,除了PHP中的字符-,我如何匹配所有的“特殊”字符(如+.*&^%$\\@!~) 我知道\W将匹配所有“特殊”字符,包括- 对Unicode字母有什么建议吗?您可以尝试这种模式 ([^a-zA-Z-]) 这应该匹配所有不是a-z和-的字符 [^-]不是您想要的特殊字符 [\W]都是您知道的特殊字符 [^\w]所有的特殊字符都是吗?听起来公平吗 因此,[^\w-]是两者的组合:所有“特殊”字符,但不包含- \pL使用Unicode字母字符属性匹配任何字符,这是一个主要的常规类别组;也就是说,它匹

除了PHP中的字符
-
,我如何匹配所有的“特殊”字符(如
+.*&^%$\\@!~

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


对Unicode字母有什么建议吗?

您可以尝试这种模式

([^a-zA-Z-])

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

    的字符
  • [^-]
    不是您想要的特殊字符
  • [\W]
    都是您知道的特殊字符
  • [^\w]
    所有的特殊字符都是吗?听起来公平吗
因此,
[^\w-]
是两者的组合:所有“特殊”字符,但不包含
-

  • \pL
    使用Unicode
    字母
    字符属性匹配任何字符,这是一个主要的常规类别组;也就是说,它匹配
    [\p{Ll}\p{Lt}\p{Lu}\p{Lm}\p{Lo}]
  • \pN
    将任何字符与Unicode
    Number
    字符属性匹配,这是一个主要的常规类别组;也就是说,它匹配
    [\p{Nd}\p{Nl}\p{No}]
  • 请注意,Unicode
    字母属性还包括某些组合标记,如U+0345◌ͅ ᴄᴏᴍʙɪɴɪɴɢ ɢʀᴇᴇᴋ ʏᴘᴏɢᴇɢʀᴀᴍᴍᴇɴɪ.  我建议您还包括
    \pM
    ,它将任何字符与Unicode
    标记
    字符属性相匹配,这是一个主要的常规类别组;也就是说,它匹配
    [\p{Mn}\p{Me}\p{Mc}]
  • 字符U+002Dʜᴘʜᴇɴ-ᴍɪɴᴜꜱ 可能是您所指的
    -
  • 请注意,Unicode v6.1使用Unicode
    Dash
    character属性有27个字符,包括U+2010等常用字符ᴘʜᴇɴ,U+2013ᴇɴ ᴅᴀꜱʜ,U+2014ᴇᴍ ᴅᴀꜱʜ和U+2212ᴍɪɴᴜꜱ ꜱɪɢɴ. 我不知道你是否真的想包括或排除这些
考虑到所有这些因素,您不太可能想要以下产品:

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

所有字符都是“特殊”字符!说出你的意思。特殊字符,如+)(*&^%$#@!~,不是任何语言的。英语当然使用了其中的大部分字符。其中许多字符在许多语言中使用。有些不是。说出你的意思。你仍然没有定义“specialness”。specialness的Unicode字符属性是什么这不好,因为unicode中可能有字母…无论如何,找到了答案![^\p{L}-\d]考虑到你的问题非常广泛,没有特定的字符集范围,所以这是我的假设。同样有效,谢谢你,出于某种原因,它与字符不匹配……但我设法绕过了这一点,你认为
[\W]是什么
那是不是
\W
不是?@tchrist:你是什么意思,我不这么认为。你为什么要在一个字符类缩写词周围写括号?你似乎把
之类的东西误分类为非特殊,把
那样的东西误分类为半特殊,把
那样的东西误分类为
之类的东西5作为特殊。这毫无意义。