Function eregi()在how to中被弃用


php Deprecated: Function eregi() is deprecated in, how to?

我有这个函数,我得到这个错误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'; 
}

关于如何解决这个问题有什么想法吗?如果你们不介意的话,我也想简单解释一下发生了什么,这样我就能理解

谢谢

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

在这种情况下,下面的代码应该可以工作:

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

Try

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

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

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


这里,解释您得到的消息的不同之处在于,PCRE期望在正则表达式周围有一个分隔符。

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


查看更多信息:

    <
  • PCRE模式/gh>完整的语法参考
  • 最有趣的是:与POSIX regex
  • 的区别

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

PCRE函数要求模式由分隔符。

ereg和preg有不同的语法。在这种情况下,它们非常相似,您可以简单地在它们之间添加分隔符,我认为这是可行的。