我正在尝试为 PHP 中的名称编写一个相当宽松的验证器,我的第一次尝试包括以下模式:
// unicode letters, apostrophe, hyphen, space
$namePattern = "/^([\\p{L}'\\- ])+$/";
这最终会传递给对
preg_match()
的调用。据我所知,这适用于您的香草 ASCII 字母表,但似乎会遇到 Ă 或张等更刺激的字符。
模式本身有问题吗?也许我期待
\p{L}
比我想象的做更多的工作?
或者它与输入的传递方式有关?我不确定它是否相关,但我确实确保在表单页面上指定了 UTF8 编码。
我认为问题比这简单得多:您忘记指定
u
修饰符。 Unicode 字符属性仅在 UTF-8 模式下可用。
你的正则表达式应该是:
// unicode letters, apostrophe, hyphen, space
$namePattern = '/^[-\' \p{L}]+$/u';
如果你想用
old pattern
替换 Unicode new pattern
你应该写:
$text = preg_replace('/\bold pattern\b/u', 'new pattern', $text);
所以这里的关键是
u
修饰符
注意:你的服务器
php version
应该至少是PHP 4.3.5
如这里所述php.net |模式修饰符
u (PCRE_UTF8) 此修饰符打开与 Perl 不兼容的 PCRE 的附加功能。模式字符串被视为 UTF-8。这 Unix 上的 PHP 4.1.0 或更高版本以及 PHP 提供修饰符 4.2.3 在 win32 上。自 PHP 4.3.5 起检查模式的 UTF-8 有效性。
谢谢
AgreeOrNot
谁给我那个钥匙preg_replace用阿拉伯语匹配整个单词
我试过了,它在本地主机上工作,但是当我在远程服务器上尝试它时,它没有工作,然后我发现 php.net 开始在 PHP 4.3.5 中使用
u
修饰符。 ,我升级了 php 版本并且它有效
重要的是要知道这种方法对阿拉伯语用户 (عربي) 非常有帮助,因为 - 我相信 - unicode 是阿拉伯语的最佳编码,如果不使用
u
修饰符,替换将不起作用,请参阅下一个例子它应该对你有用
$text = preg_replace('/\bمرحبا بك\b/u', 'NEW', $text);
首先,如果您在编写这些内容时使用单撇号而不是双引号,您的生活将会轻松得多——您只需要一个反斜杠。其次,还应包括组合标记
\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 字符表吗?
任何其他看这里但没有让它工作的人,请注意
/u
不会在不同 PHP 版本的 Unicode 脚本中产生一致的结果。
<?php preg_match('/[a-zığüşöç]/u',$title) ?>