簡體   English   中英

如何用預浸料正確替代ereg

[英]How to correctly replace ereg with preg

我有一個用於正確顯示內容的移動設備列表。 已折舊的函數如下所示:

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

如果可以信任所有模式字符串( $userAgentiphone )不包含特殊的正則表達式字符( ()[]!|.^${}?*+ ),則只需將eregi regex包含斜杠( / )和在最后一個斜杠后面添加一個i (表示“不區分大小寫”)。

所以:

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

但是,您只是嘗試在$browserAgent匹配$userAgent嗎? 例如,如果特定的$userAgentfoo.bar ,那么您是否想要. 匹配字面量,還是要以正則表達式解釋(“匹配任何字符”)?

如果是前者,我建議您完全放棄正則表達式,並使用stripos($haystack,$needle) ,它在$haystack搜索字符串$needle (不區分大小寫)。 然后,您不必擔心$userAgent的星號以正則表達式而不是字面意義進行解釋。

如果您確實使用stripos請不要忘記它可以返回0 ,其結果為false ,因此您需要使用=== false!== false (請參閱我鏈接的文檔)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM