我在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
产生匹配,空字符串产生不匹配。我希望反过来因为||
应该代表空字符串。
这里发生了什么?
答案 0 :(得分:4)
这个正则表达式:
\b(39||90)\b
如果任何更改匹配,将返回成功匹配。这些是:
39
90
||
)但是在空字符串中没有单词边界。单词边界\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)