0

我有一个用于正确显示内容的移动设备列表。折旧函数如下所示:

function detectPDA($query){
    $browserAgent = $_SERVER['HTTP_USER_AGENT'];
    $userAgents = $this->getBrowserAgentsToDetect(); // comma separated list of devices
    foreach ( $userAgents as $userAgent ) {
        if(eregi($userAgent,$browserAgent)){
            if(eregi("iphone",$browserAgent) || eregi("ipod",$browserAgent) ){
                $this->iphone = true;
            }else{
                $this->pda = true;
            }
        }
    }
}

替换eregi 功能的正确方法是什么?

4

1 回答 1

0

如果可以信任所有模式字符串 ( $userAgentand ) 不包含特殊的正则表达式字符 ( ),那么您只需用斜杠 ( ) 将正则表达式括起来并在最后一个斜杠之后添加一个(这意味着“不区分大小写”)。iphone()[]!|.^${}?*+eregi/i

所以:

eregi($userAgent,$browserAgent) --> preg_match("/$userAgent/i",$browserAgent)
eregi("iphone",$browserAgent)   --> preg_match('/iphone/i',$browserAgent)

但是,您是否只是想在$userAgent内按原样匹配$browserAgent?例如,如果一个特定的$userAgentwas foo.bar,您是否希望.匹配一个文字句点,或者您希望在其正则表达式意义上解释它(“匹配任何字符”)?

如果是前者,我建议你完全放弃正则表达式并使用,它在(不区分大小写)stripos($haystack,$needle)中搜索字符串。然后,您无需担心(例如)星号会以正则表达式而不是字面意义进行解释。$needle$haystack$userAgent

如果您确实使用stripos了,请不要忘记它可以返回 a 0which 将评估为false,因此您需要使用=== falseor !== false(请参阅我链接的文档)。

于 2012-01-11T12:35:09.607 回答