Как правильно заменить ereg на preg - PullRequest
0 голосов
/ 11 января 2012

У меня есть список мобильных устройств, которые я использую для корректного отображения контента. Устаревшая функция выглядит так:

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 Ответ

0 голосов
/ 11 января 2012

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

...