2012-01-11 56 views
0

我有一个移动设备的列表,用于正确显示内容。折旧功能如下所示:如何正确使用preg替换ereg

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函数的正确方法?

回答

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),这在$haystack(不区分大小写)搜索字符串$needle。那么你不需要担心(例如)$userAgent中的星号被解释为正则表达式而不是字面意义。

如果使用stripos不要忘记它可以返回一个0这将评估为false,所以你需要使用=== false!== false(见链接我的文档)。

+0

感谢您的回应 - 也是解释正则表达式的注释..最有用的。 – Innate 2012-01-12 16:31:17