Как правильно заменить 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 (см. документацию, которую я связал).

Другие вопросы по тегам