正则表达式具有各种特性,其中之一是我最近在 PHP 和 preg_match
中创建正则表达式时遇到的。当我遇到一个问题时,我试图解析格式为“真实姓名(:用户名)”的字符串,我在 Mozilla 经常遇到这样的问题:我的正则表达式没有正确捕捉“特殊”或“国际”字母,例如 à , é, ü 和其他几十个。
我的正则表达式在正则表达式的实名匹配部分使用了 A-z
,我认为它会匹配特殊字母,但事实并非如此:
preg_match( "/([A-Za-z -]+)?\s?\[?\(?:([A-Za-z0-9\-\_]+)\)?\]?/", "Yep Nopé [:ynope]", $matches); // 0 => '[:ynope]', 1 => 'Yep Nopé', 2 => 'ynope'
为了匹配国际字母,我需要通过两种方式更新我的正则表达式:
- 在匹配片段中将
A-z
更改为\pL
- 添加
u
修饰符使字符串被视为 UTF-8
更新后的正则表达式为:
preg_match( "/([\pL -]+)?\s?\[?\(?:([\pL0-9\-\_]+)\)?\]?/u", "Yep Nopé [:ynope]", $matches); // 0 => 'Yep Nopé [:ynope]', 1 => 'Yep Nopé', 2 => 'ynope'
你可以在这里看到我的简单测试平台。如果您担心其他字符可能会渗入,或者不信任 \pL
,您可以手动列出每个特殊字母(即 [A-zàáâä....])
在像 Mozilla 这样真正的全球性组织工作的好处之一是我会接触到许多边缘案例;在这种情况下,一些特殊字母!