2017-09-04 113 views
0

由于正则表达式不是我最好的一面,我需要你们的帮助。所以我有这个线在我的PHP代码为什么这个正则表达式返回true?

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!" 

的问题是,这是为什么返回true,以及如何把它写有道所以它会工作这应该?

回答

1

这种模式是无效的:

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

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

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

Debuggex Demo

+0

所以我也应该删除^ $? –

+0

确实,虽然它看起来像在debuggex上,但这两个字符完全不参与匹配,因此它们不匹配空字符串。无论哪种方式,他们是无用的。 – SirDarius

5

因为你的模式的开始空字符串匹配:

/|google... 

这意味着:没有或谷歌......

+0

omg,你是对的...谢谢你亲切的先生! –