【问题标题】:PHP preg_match returns different value on 2 different serversPHP preg_match 在 2 个不同的服务器上返回不同的值
【发布时间】:2015-05-06 22:29:22
【问题描述】:

我正在使用 preg_match() 来检查用户输入的字符串是否匹配所需的格式。以前,网站的本地版本返回与生产版本相同的值,但是,现在本地版本在应该为 True 时返回 False。

这是我用来验证用户名字的代码示例:

$firstName = 'John';
if (preg_match("/^[A-Z\p{L}][A-Z\' -\p{L}]{0,49}$/ui", $firstName)) {
echo 'True';
} else {
echo 'False';
}

本地版本错误地返回 False。如果相关,它正在运行 PHP 版本 5.5.17。

生产版本正确返回 True。如果相关,它正在运行 PHP 版本 5.3.29。

我没有看到 preg_match 的 PHP 规范最近有任何变化。谁能告诉我为什么这两个版本的网站在使用相同的代码时返回不同的值?谢谢。

【问题讨论】:

  • 使用 v5.6.3 编译正则表达式时出现错误:偏移 20 处字符类中的无效范围
  • 我得到了和@TomFenech 一样的结果
  • 这些-\p 似乎是冒犯的角色。您可以执行-\'p,它将返回 TRUE。您可能在p 之前忘记了' - 或尝试[A-Z\-\p{L}]
  • 所以,在 cmets 和给出的答案中;这个问题还有悬念吗?

标签: php preg-match


【解决方案1】:

我也得到与@TomFenech 相同的结果,但是如果我在第二个“p”之前删除 -。 "/^[A-Z\p{L}][A-Z\' \p{L}]{0,49}$/ui", $firstName 它以 True 响应

$firstName = 'John';
if (preg_match("/^[A-Z\p{L}][A-Z\' \p{L}]{0,49}$/ui", $firstName)) {
    echo 'True';
} else {
    echo 'False';
}

不过,我也逃脱了破折号,也获得了 True。

if (preg_match("/^[A-Z\p{L}][A-Z\' \-\p{L}]{0,49}$/ui", $firstName)) {

$ php -v
PHP 5.5.19 (cli) (built: Nov 14 2014 01:09:01)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies

【讨论】:

  • 谢谢亚当,我认为您回答的第二部分看起来像我需要的解决方案,因为它保留了现有的正则表达式格式,但具有所需的验证结果。我会对此进行测试并尽快回复您。
  • 酷。希望它有所帮助:)
  • 确实如此,我已经对此进行了测试,此解决方案完全如愿解决了问题,再次感谢!
猜你喜欢
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多