无法理解两个preg_match模式之间的区别

时间:2012-01-25 14:10:51

标签: php regex drupal drupal-6 preg-match

在原始代码(Drupal核心模块)中,前一位开发人员注释掉了字符串:

if (preg_match('/[^\x{80}-\x{F7} a-z0-9@_.\'-]/i', $name)) {

而是添加:

if (preg_match('/[^\x{80}-\x{F7} a-z0-9@_.\'-]/iu', $name)) {
你可以帮助我理解这两者之间的区别吗?你的修饰语有什么作用?在PHP文档中,我发现:

  你(PCRE8)
  此修饰符打开与Perl不兼容的PCRE的其他功能。模式字符串被视为UTF-8。此修饰符可从Unix上的PHP 4.1.0或更高版本以及win32上的PHP 4.2.3获得。从PHP 4.3.5开始检查模式的UTF-8有效性。

所以我猜,以前的开发人员在解释特殊字符或其他东西时遇到了问题。我有点困惑,请就此提出建议。

2 个答案:

答案 0 :(得分:4)

需要修饰符才能正确处理utf-8编码输入。像\ xC1这样的模式应该与unicode字符U + 00C1(À)匹配。在utf-8中编码Á时,你会得到\ xC3 \ x81,所以\ xC1不匹配。 “u”修饰符使算法使用utf-8,因此匹配。

基本上,当您使用utf-8编码文本时,会发生这种情况:

<?php
var_dump(preg_match('/\xC1/u', 'Á'));
// => int(1), matches

var_dump(preg_match('/\xC1/', 'Á'));
// => int(0), doesn't match
?>

在您的情况下,由于UTF-8的工作方式,第一个正则表达式[^ \ x80- \ xF7]与无(非ascii)UTF-8编码文本匹配。第二个表达式匹配U + 0080 - U + 00F7范围之外的unicode字符,因此它允许通过所有西里尔语,希腊语,阿拉伯语,希伯来语,......

答案 1 :(得分:0)

u - 意味着preg match将检查UTF-8字符串,而不仅仅是像A-Z那样的iso-8859-1

当量

$what = 'łódka - русский алфавит';

if ( preg_match_all('#([\w A-Za-z])#u',$what,$res) ) :
echo  'math eq' .  'łódka - русский алфавит';
endif;