php不推荐使用:函数eregi()已弃用,如何?

时间:2011-07-23 15:08:12

标签: php preg-match eregi

我有这个功能,我收到此错误Deprecated: Function eregi() is deprecated in...。如果我将eregi更改为preg_match,我会收到此错误Warning: preg_match() [function.preg-match]: Delimiter must not be alphanumeric or backslash in...

function getBrowser($userAgent) {
$browsers = array(
    'Opera' => 'Opera',
    'Mozilla Firefox'=> '(Firebird)|(Firefox)', // Use regular expressions as value to identify browser
    'Galeon' => 'Galeon',
    'Chrome'=>'Gecko',
    'MyIE'=>'MyIE',
    'Lynx' => 'Lynx',
    'Netscape' => '(Mozilla/4\.75)|(Netscape6)|(Mozilla/4\.08)|(Mozilla/4\.5)|(Mozilla/4\.6)|(Mozilla/4\.79)',
    'Konqueror'=>'Konqueror',
    'SearchBot' => '(nuhk)|(Googlebot)|(Yammybot)|(Openbot)|(Slurp/cat)|(msnbot)|(ia_archiver)',
    'Internet Explorer 8' => '(MSIE 8\.[0-9]+)',
    'Internet Explorer 7' => '(MSIE 7\.[0-9]+)',
    'Internet Explorer 6' => '(MSIE 6\.[0-9]+)',
    'Internet Explorer 5' => '(MSIE 5\.[0-9]+)',
    'Internet Explorer 4' => '(MSIE 4\.[0-9]+)',
);
foreach($browsers as $browser=>$pattern) {
    if(eregi($pattern, $userAgent)) {
        return $browser; 
    }
}
return 'Unknown'; 
}

有关如何解决此问题的任何想法。如果你们不介意我也能理解,我还想对所发生的事情进行愚蠢的解释

感谢

4 个答案:

答案 0 :(得分:3)

你应该使用分隔符。请阅读http://www.php.net/manual/en/reference.pcre.pattern.posix.php

在这种情况下,以下内容应该有效:

if(preg_match('`'.$pattern.'`i', $userAgent))

答案 1 :(得分:1)

ereg()是在PHP中使用正则表达式的旧方法,而PCRE(preg_match和其他preg_*)更快更强大 - 这就解释了为什么第一个现在是弃用。

从ereg迁移到PCRE应该不会太难,但这两个引擎接受的语法之间存在一些差异 - 这意味着你可能需要修复几个正则表达式。


在这里,解释您收到的消息的区别在于 PCRE期望正则表达式围绕正则表达式

例如,您的正则表达式不应该是Galeon,而是/Galeon/
你可以使用你喜欢的任何字符作为分隔符。


有关更多信息:

引用最后一个链接的第一点:

  

PCRE功能要求图案包含在内   delimiters

答案 2 :(得分:1)

尝试

if(preg_match("#".$pattern."#", $userAgent)) {

答案 3 :(得分:0)

ereg和preg有不同的语法。在这种情况下,它们足够相似,您可以简单地在它们周围添加分隔符,我认为它会起作用。