如何与正则表达式匹配PHP中除“-”之外的所有特殊字符?
Posted
技术标签:
【中文标题】如何与正则表达式匹配PHP中除“-”之外的所有特殊字符?【英文标题】:How to match with regex all special chars except "-" in PHP? 【发布时间】:2012-04-01 09:30:03 【问题描述】:如何匹配除 php 中的字符 -
之外的所有“特殊”字符(如 +_*&^%$#@!~
)?
我知道\W
将匹配所有“特殊”字符,包括-
。
关于 Unicode 字母有什么建议吗?
【问题讨论】:
特殊字符,如 +_)(*&^%$#@!~,不是任何语言... 【参考方案1】:\pL
匹配任何具有 Unicode Letter
字符属性的字符,这是一个大的通用类别组;也就是说,它匹配[\pLl\pLt\pLu\pLm\pLo]
。
\pN
匹配任何具有 Unicode Number
字符属性的字符,这是一个主要的通用类别组;也就是说,它匹配[\pNd\pNl\pNo]
。
请注意,Unicode Alphabetic
字符属性还包括某些组合标记,例如 U+0345 ◌ͅ ᴄᴏᴍʙɪɴɪɴɢ ɢʀᴇᴇᴋ ʏᴘᴏɢᴇɢʀᴀᴍᴍᴇɴɪ。我建议你还包括\pM
,它匹配任何具有Unicode Mark
字符属性的字符,这是一个主要的通用类别组;也就是说,它匹配[\pMn\pMe\pMc]
。
字符 U+002D ʜʏᴘʜᴇɴ-ᴍɪɴᴜꜱ 可能是您所指的-
。
请注意,尽管 Unicode v6.1 有 27 个字符,具有 Unicode Dash
字符属性,包括 U+2010 ʜʏᴘʜᴇɴ、U+2013 ᴇɴ ᴅᴀꜱʜ、U+2014 ᴇᴍ ᴅᴀꜱʜ等常见字符, 和 U+2212 ᴍɪɴᴜꜱ ꜱɪɢɴ。不管你是真的想包括还是排除那些,我不知道。
考虑到所有这些,您不太可能想要这样的东西:
[^\pL\pN\pM\x2D\x2010-\x2015\x2212]
【讨论】:
【参考方案2】:[^-]
不是你想要的特殊字符
[\W]
都是你知道的特殊字符
[^\w]
也是特殊字符 - 听起来公平吗?
因此[^\w-]
是两者的组合:所有“特殊”字符但没有-
。
【讨论】:
也可以,谢谢,由于某种原因它与 _ 字符不匹配...但我设法绕过了它, 您认为[\W]
会做什么而\W
不会?
@tchrist:你什么意思,我不这么认为。
为什么要在单个字符类缩写周围加上方括号?
您似乎将_
之类的东西误分类为非特殊,将àéüîøçñ
之类的东西误分类为一半-special,以及像‾ΑΒK5
这样的东西作为special。这根本没有意义。【参考方案3】:
你可以试试这个模式
([^a-zA-Z-])
这应该匹配所有不是a-z
和-
的字符
【讨论】:
不好,因为unicode中可以有字母……总之,找到答案了! [^\pL-\d] 考虑到您的问题非常广泛,没有特定的字符集范围,所以这是我的假设。以上是关于如何与正则表达式匹配PHP中除“-”之外的所有特殊字符?的主要内容,如果未能解决你的问题,请参考以下文章