如何替换ereg?

11

我需要使用一些PHP代码,但是这些代码不是我写的,我遇到了以下错误信息:

Deprecated: Function ereg() is deprecated in /opt/lampp/htdocs/webEchange/SiteWeb_V5/inc/html2fpdf.php on line 466

这是第466行:

if(ereg('^([^=]*)=["\']?([^"\']*)["\']?$',$v,$a3))

我尝试使用 preg_match 简单替换,但它无法识别正则表达式中的 = 修饰符。我对正则表达式还不太熟悉,要解决这个问题需要学习 ereg 需要的正则表达式以及 preg_match 需要的正则表达式(如果我没记错的话,它们是不同的)... 你们能帮我解决这个问题吗?

谢谢


可能是如何将ereg表达式转换为PHP中的preg?的重复问题。 - Meloman
4个回答

8

POSIX扩展正则表达式(POSIX ERE,由ereg使用)和Perl兼容正则表达式(PCRE,由preg_match使用)非常相似。除了一些特殊的POSIX表达式外,PCRE是POSIX ERE的超集。

这意味着您只需要将POSIX ERE正则表达式放入定界符(这里是/),并转义正则表达式内该字符的任何出现,就可以得到有效的PCRE正则表达式:

/^([^=]*)=["']?([^"']*)["']?$/

所以:
preg_match('/^([^=]*)=["\']?([^"\']*)["\']?$/', $v, $a3)

除了字符类之外,并不是真正的超集,例如使用 ERE 在 ABCD 上匹配 /AB|ABC/ 将给出最长匹配 (ABC),但 PCRE 将给出第一个匹配 (AB)。 - kennytm

2

尝试:

if(preg_match('~^([^=]*)=["\']?([^"\']*)["\']?$~',$v,$a3))

在 preg_match 中的正则表达式需要用一对分隔符括起来,而已经被弃用的 ereg() 函数则不需要。


0

preg_ 函数族期望正则表达式被定界。而不是:

'^([^=]*)=["\']?([^"\']*)["\']?$'

尝试:

'/^([^=]*)=["\']?([^"\']*)["\']?$/'

0

复制自其他贡献者:

这不是替代函数,而是恢复 ereg 函数:

if(!function_exists('ereg'))            { function ereg($pattern, $subject, &$matches = []) { return preg_match('/'.$pattern.'/', $subject, $matches); } }
if(!function_exists('eregi'))           { function eregi($pattern, $subject, &$matches = []) { return preg_match('/'.$pattern.'/i', $subject, $matches); } }
if(!function_exists('ereg_replace'))    { function ereg_replace($pattern, $replacement, $string) { return preg_replace('/'.$pattern.'/', $replacement, $string); } }
if(!function_exists('eregi_replace'))   { function eregi_replace($pattern, $replacement, $string) { return preg_replace('/'.$pattern.'/i', $replacement, $string); } }
if(!function_exists('split'))           { function split($pattern, $subject, $limit = -1) { return preg_split('/'.$pattern.'/', $subject, $limit); } }
if(!function_exists('spliti'))          { function spliti($pattern, $subject, $limit = -1) { return preg_split('/'.$pattern.'/i', $subject, $limit); } }

2
这是来自哪个贡献者的?你是在说这个_不起作用_吗?通过阅读代码,这似乎为废弃的函数提供了一个polyfill。你测试过与原始帖子中的具体表达式吗? - Jeremy Caney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接