如何正确地用preg替换ereg

时间:2012-01-11 08:13:51

标签: preg-match eregi

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

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功能的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

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

所以:

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

但是,您只是想在$userAgent内按原样匹配$browserAgent吗?例如,如果特定$userAgentfoo.bar,您希望.与文字句点匹配,还是希望以其正则表达式解释它(“匹配任何字符” )?

如果是前者,我建议您完全放弃正则表达式并使用stripos($haystack,$needle),它会在$needle中搜索字符串$haystack(不区分大小写)。那么你不必担心(比方说)$userAgent中的星号在正则表达式中被解释而不是字面意义。

如果您使用stripos,请不要忘记它会返回0,评估为false,因此您需要使用=== false或{{1} (参见我链接的文档)。