正则表达式具有各种特性,我最近在 PHP 中创建正则表达式时遇到了其中一个特性 preg_match
. 当我遇到问题时,我试图解析格式为“Real Name (:username)”的字符串,我会在 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 这样真正的全球性组织中工作的好处之一是我接触到了许多边缘案例。 在这种情况下,一些特殊的字母!