为什么这个正则表达式返回true?

时间:2017-09-04 11:11:36

标签: php regex

由于正则表达式不是我最好的一面,我需要你们的帮助。所以我的PHP代码中有这一行

var_dump($_SERVER['HTTP_USER_AGENT']);
if(preg_match('/|google|robot|bot|spider|crawler|curl|Facebot|facebook|archiver|^$/i', $_SERVER['HTTP_USER_AGENT'])) {
   var_dump('returning true!');
   return true;
}
die('end');

这是var_dumps

的输出
string(121) "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"

string(15) "returning true!"

问题是为什么这会返回真实以及如何以正确的方式编写它以便它能够正常工作?

2 个答案:

答案 0 :(得分:5)

因为模式的开头与空字符串匹配:

/|google...

这意味着:什么都不是谷歌...

答案 1 :(得分:1)

此模式无效:

|google|robot|bot|spider|crawler|curl|Facebot|facebook|archiver|^$
^
|
+--- this character (an alternator) effectively renders the regex useless

这意味着正则表达式理论上可以匹配任何东西,因为左边部分是空的。

此外,最后一个交流发电机右侧的^$也表示空字符串匹配。

Debuggex Demo