我有一个移动设备列表,我用它来正确显示内容。折旧函数如下所示:
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 :(得分:0)
如果可以信任所有模式字符串($userAgent
和iphone
)不包含特殊的正则表达式字符(()[]!|.^${}?*+
),那么您只需将eregi
正则表达式包围起来斜杠(/
)并在最后一个斜杠后添加i
(表示“不区分大小写”)。
所以:
eregi($userAgent,$browserAgent) --> preg_match("/$userAgent/i",$browserAgent)
eregi("iphone",$browserAgent) --> preg_match('/iphone/i',$browserAgent)
但是,您只是想在$userAgent
内按原样匹配$browserAgent
吗?例如,如果特定$userAgent
为foo.bar
,您希望.
与文字句点匹配,还是希望以其正则表达式解释它(“匹配任何字符” )?
如果是前者,我建议您完全放弃正则表达式并使用stripos($haystack,$needle)
,它会在$needle
中搜索字符串$haystack
(不区分大小写)。那么你不必担心(比方说)$userAgent
中的星号在正则表达式中被解释而不是字面意义。
如果您使用stripos
,请不要忘记它会返回0
,评估为false
,因此您需要使用=== false
或{{1} (参见我链接的文档)。