PHP preg_match()PCRE逻辑问题?

时间:2016-07-20 03:18:25

标签: php regex preg-match pcre

请考虑以下事项:

$lat = '89° 5'; // works
if(preg_match('/^(([0-8]\d|\d)°?(\s?([0-5]\d|\d))?)(N|S)?$/', $lat, $la)){
  $ck = 'DD° MM format --> ';
}
else{
  $test = 'invalid $lat format';
}
if(isset($ck)){
  $test = $ck.$la[0];
}
echo $test;

$lat = '89°5'一切正常时也是如此。我试图理解的是$lat = '89 5'失败的原因?也许我的大脑不起作用,但由于°?,似乎最后一个不应该是无效的格式。谢谢你帮助我理解。

1 个答案:

答案 0 :(得分:3)

使用/(*UTF8)^(([0-8]\d|\d)°?(\s?([0-5]\d|\d))?)(N|S)?$/

来自http://www.pcre.org/pcre.txt

  

为了处理UTF-8字符串,您必须构建具有UTF支持的PCRE的8位库,此外,必须使用PCRE_UTF8选项标志调用pcre_compile(),否则模式必须以序列开头(* UTF8)或(* UTF)。当这两种情况都是这种情况时,模式和与之匹配的任何主题字符串都被视为   UTF-8字符串,而不是单个1字节字符的字符串。

因此,PCRE引擎仍将°视为两个单独的字符,并且仅将后半部分视为可选字段。

注意:有趣的是,我只能在安装时使用(​​小写)u修饰符获得预期结果。 http://php.net/manual/en/reference.pcre.pattern.modifiers.php

注意2:我的原始评论有两个选项,不要使用另一个选项,因为它打破了目前适合你的测试。