Как правильно заменить ereg на 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?
1 ответ
Если все строки шаблона ($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
или же !== false
(см. документацию, которую я связал).