在PCRE/PHP中匹配Unicode字母字符
我正在尝试为PHP中的名称编写一个合理许可的验证器,我的第一次尝试包括以下模式:在PCRE/PHP中匹配Unicode字母字符,php,regex,unicode,pcre,character-properties,Php,Regex,Unicode,Pcre,Character Properties,我正在尝试为PHP中的名称编写一个合理许可的验证器,我的第一次尝试包括以下模式: // unicode letters, apostrophe, hyphen, space $namePattern = "/^([\\p{L}'\\- ])+$/"; 这最终会传递给对preg\u match()的调用。据我所知,这适用于您的香草ASCII字母表,但似乎在使用像Ă或这样的辣字符时出错张. 图案本身有问题吗?也许我期望\p{L}做的工作比我想象的要多 还是与输入的传递方式有关?我不确定它是否相关,
// unicode letters, apostrophe, hyphen, space
$namePattern = "/^([\\p{L}'\\- ])+$/";
这最终会传递给对preg\u match()
的调用。据我所知,这适用于您的香草ASCII字母表,但似乎在使用像Ă或这样的辣字符时出错张.
图案本身有问题吗?也许我期望\p{L}
做的工作比我想象的要多
还是与输入的传递方式有关?我不确定它是否相关,但我确实确保在表单页面上指定UTF8编码。首先,如果在编写这些代码时使用单撇号而不是双引号,您的生活会容易得多——您只需要一个反斜杠。其次,还应包括组合标记
\pM
。如果您发现一个字符不匹配,请找出它的Unicode代码点,然后您可以使用找出它在哪里。在调试UTF-8属性时,我发现了一个非常有用的工具(在尝试查找之前不要忘记转换为十六进制:array\u map('dechex',utf8ToUnicode($text))
)
例如,Ă在Lu中是和,所以我应该匹配它,它确实适合我。另一个角色是,也是,更聪明,确实适合我。您是否有编译的Unicode字符表 我认为问题要简单得多:您忘记指定
u
。Unicode字符属性为
您的正则表达式应该是:
// unicode letters, apostrophe, hyphen, space
$namePattern = '/^[-\' \p{L}]+$/u';
如果要将Unicode
旧模式
替换为新模式
,则应编写:
$text = preg_replace('/\bold pattern\b/u', 'new pattern', $text);
所以这里的关键是u
modifier
注意:您的服务器php版本
至少应为php4.3.5
如前所述
u(PCRE\u UTF8)
此修饰符打开与Perl不兼容的PCRE的附加功能。模式字符串被视为UTF-8。这
修饰符可从Unix上的PHP4.1.0或更高版本以及PHP中获得
win32上的4.2.3。从PHP4.3.5开始检查模式的UTF-8有效性
谢谢AgreeOrNot
谁给了我钥匙
我在localhost中尝试过,但在远程服务器中尝试时,它不起作用,然后我发现php.net start在PHP4.3.5中使用了u
修饰符,我升级了php版本,它可以正常工作
重要的是要知道,这种方法对阿拉伯语用户非常有用(عبي),因为——我相信——unicode是阿拉伯语的最佳编码,如果不使用u
修饰符,替换将不起作用,请参见下一个示例,它应该适用于您
$text=preg_replace('/\bمحب㶕㶕ك\b/u',NEW',$text)
如果其他人在这里查看,但没有将其付诸实施,请注意,/u
不会在不同的PHP版本中使用Unicode脚本生成一致的结果
见示例:
相关:
奇怪。试试$namePattern='/^[\pL]$/'$a=张'; 变量转储(预匹配($namePattern,$a))$a=张1'; 变量转储(预匹配($namePattern,$a))代码>和变体。没有你,这对我来说确实有用。PHP 5.3.2-1ubuntu4。7@chx:给我int(0)
。您的文件可能没有使用UTF-8进行编码。是的,我使用了回答中显示的utf8ToUnicode例程来验证文件中的代码点。@chx:在这种情况下,我不知道。如果没有修饰符,它对我不起作用,但它对它起作用。由于PHP没有适当的多字节支持,编码问题很常见。是的,只需添加u
。后续问题:u
表示什么?由于我没有u
的模式仍然匹配ASCII,我猜它告诉正则表达式一些关于输入字符串性质的信息,而不是模式本身。
<?php preg_match('/[a-zığüşöç]/u',$title) ?>