【问题标题】:PHP preg_match() PCRE logic issue?PHP preg_match() PCRE 逻辑问题?
【发布时间】:2016-07-20 03:18:25
【问题描述】:

考虑以下几点:

$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' 失败了?也许我的大脑不工作,但似乎最后一个不应该是无效格式,因为°?。感谢您帮助我理解。

【问题讨论】:

  • 如果添加 /u 修饰符会发生什么?
  • 我在 debian 上安装 php 5.6 时收到无效格式错误。我会玩这个...
  • 3v4l.org 适用于所有 PHP 版本:3v4l.org/2aL3N
  • 我通过/(*UTF8)^(([0-8]\d|\d)°?(\s?([0-5]\d|\d))?)(N|S)?$/@PHPglue,你能确认一下吗?

标签: php regex preg-match pcre


【解决方案1】:

使用/(*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:我原来的评论有两个选项,不要使用另一个,因为它会破坏当前适合您的测试。

【讨论】:

  • /u 应该是我一直使用的。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多