我正在尝试用 PHP 编写一个合理宽松的名称验证器,我的第一次尝试包括以下模式:// unicode 字母、撇号、连字符、空格$namePattern = \'/^([\\...
我正在尝试用 PHP 编写一个合理允许的名称验证器,我的第一次尝试包含以下模式:
// unicode letters, apostrophe, hyphen, space
$namePattern = "/^([\\p{L}'\\- ])+$/";
这最终被传递给对 的调用 preg_match()
。据我所知,这适用于普通的 ASCII 字母表,但似乎会遇到更复杂的字符,如 Ă 或 。
模式本身有问题吗?也许我期望 \p{L}
做的工作比我想象的要多?
或者这是否与输入传递的方式有关?我不确定这是否相关,但我确实确保在表单页面上指定了 UTF8 编码。
首先,如果您在编写这些内容时使用单撇号而不是双引号,您的生活会轻松很多——您只需要一个反斜杠。其次, \pM
还应包括组合标记。如果您发现不匹配的字符,请找出其 Unicode 代码点,然后您可以使用 http://www.fileformat.info/info/unicode/ 找出它的位置。我发现 http://hsivonen.iki.fi/php-utf8/ 在使用 UTF-8 属性进行调试时是一个非常有用的工具(在尝试查找之前,不要忘记转换为十六进制:) array_map('dechex', utf8ToUnicode($text))
。
例如,Ă 实际上是 http://www.fileformat.info/info/unicode/char/0102/index.htm ,属于 Lu,因此 L 应该匹配,而且对我来说确实匹配。另一个字符是 http://www.fileformat.info/info/unicode/char/5f20/index.htm ,也是 isLetter,对我来说确实匹配。您有编译好的 Unicode 字符表吗?