0

我发现这个方法在堆栈溢出时效果很好

$badAgents = array('fooAgent','blahAgent', 'etcAgent');
if(in_array($_SERVER['HTTP_USER_AGENT'],$badAgents)) {
    exit();
}

问题是字符串需要与数组中的字符串完全匹配。

我需要一个新方法来询问用户代理是否包含(在字符串的任何部分)数组中的一个字符串(不完全匹配只是询问它是否包含一个字符/单词里面的几个选项数组)......所以我想出了这个:

$badAgents = array('google','libwww');

if (strpos(in_array(strtolower($_SERVER['HTTP_USER_AGENT']))), $badAgents) == true) {
    exit();
}

它不起作用,但我认为它可以通过小调整来工作。

非常感谢你们!

4

3 回答 3

0

我无法发表评论,因此需要将其发布为答案。请注意 strpos 上的警告http://php.net/manual/en/function.strpos.php 当字符串的位置为 0(字符串的开头)时,上面的代码将无法按预期工作。

代码也被进一步破坏。您不能对 in_array(布尔值)的结果执行 strpos。

我看到的唯一方法是遍历数组并为每个元素执行 strpos(假设坏代理数组由要查找的子字符串组成)。

更新示例:

$badAgents = array('google','libwww','chrome');
$userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
foreach($badAgents as $badAgent)
{
    if (strpos($userAgent, $badAgent) !== false)
    {
        exit();
    }
}

可运行示例:

<?php
$badAgents = array('google','libwww','chrome');

//$userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
$userAgent = strtolower('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11');
foreach($badAgents as $badAgent)
{
    if (strpos($userAgent, $badAgent) !== false)
    {
        exit();
    }
}

此外,即使起初不太清楚 get_browser() 是一条更好更干净的路线(正如 Steven Liao 所建议的那样)

于 2013-08-08T01:43:19.697 回答
0

问题是in_array检查是否完全匹配。

如果要检查是否包含字符串,可以迭代数组中的每个元素:

foreach ($badAgents as $bad_user_agent) {
    if (stripos($_SERVER['HTTP_USER_AGENT'], $bad_user_agent) !== false) {
         exit();
    }
}

PS请注意,我使用stripos的是不区分大小写的

于 2013-08-08T01:45:03.230 回答
0

一般来说,最佳实践是使用特征检测而不是用户代理切换。

但是,在这种情况下,您的括号位置似乎已关闭。此外,我重写了等式以使其更清晰(因为某些值可能评估为 FALSE)。

if (strpos(in_array(strtolower($_SERVER['HTTP_USER_AGENT'])), $badAgents) !== FALSE) {
    exit();
}
于 2013-08-08T01:40:22.453 回答