PHP 5.6正则表达式出乎意料的行为

时间:2018-05-25 18:06:28

标签: php regex pcre

我在PHP 5.6中遇到过一种奇怪的行为(未经其他版本测试)

var_dump(preg_match('#\b(39||90)\b#', '42')); // int(1)
var_dump(preg_match('#\b(39||90)\b#', '')); // int(0)

https://regex101.com表示模式\b(39||90)\b无效,但PHP preg_match不会返回FALSE,如果模式无效则应该返回FALSE。

如您所见,42产生匹配,空字符串产生不匹配。我希望反过来因为||应该代表空字符串。

这里发生了什么?

1 个答案:

答案 0 :(得分:4)

这个正则表达式:

\b(39||90)\b

如果任何更改匹配,将返回成功匹配。这些是:

  1. 完整字39
  2. 完整字90
  3. 输入中的字边界任何地方(因为空||
  4. 但是在空字符串中没有单词边界。单词边界\b在单词\w和非单词\W之间声明为真。

    E.g。看到这些结果:

    // no word character hence false
    var_dump(preg_match('#\b(39||90)\b#', '#@'));
    int(0)
    
    # a word char hence true
    php > var_dump(preg_match('#\b(39||90)\b#', 'a'));
    int(1)
    
    // no word character hence false
    php > var_dump(preg_match('#\b(39||90)\b#', "\t\n"));
    int(0)