由于自PHP 5.3.0以来不推荐使用POSIX正则表达式(ereg),因此我想知道将旧表达式转换为PCRE(Perl兼容正则表达式)(preg)的简单方法。
每个例子,我有这个正则表达式:
eregi('^hello world');
如何将表达式转换为preg_match兼容表达式?
Note: This post serves as a placeholder for all posts related to conversion from ereg to preg, and as a duplicate options for related questions. Please do not close this question.
Related:
How to change PHP's eregi to preg_match
Changing ereg_replace to equivalent preg_replace
@ yes123:是的,这就是重点,我也厌倦了。 我想要一个wiki帖子,它实际上解释了一些东西,所以我们可以关闭所有这些问题。
我认为不需要这个,因为你只需要用分隔符包装旧的。 此外,我认为你可以使用之前回答的问题。
啊,在阅读评论之前投票结束了。 作为一个占位符,它可以达到一个目的,但不是有另一个可以作为这样的老问题吗?
嗯,的确如此。 ereg不会产生非常有用的结果。 好的,可以支持这个。
@netcoder:acutally我想我几乎回答了这里的一切:stackoverflow.com/questions/6269693/不要吹嘘当然
伙计们,我们似乎几乎创造了一个关于这个话题的封闭问题,所有人都指向对方。 在这个速度他们都将被关闭:)
语法中最大的变化是添加了分隔符。
ereg('^hello', $str);
preg_match('/^hello/', $str);
分隔符可以是几乎不是字母数字,反斜杠或空白字符的任何东西。最常用的通常是~,/和#。
您还可以使用匹配的括号:
preg_match('[^hello]', $str);
preg_match('(^hello)', $str);
preg_match('{^hello}', $str);
// etc
如果在正则表达式中找到了分隔符,则必须将其转义:
ereg('^/hello', $str);
preg_match('/^\/hello/', $str);
您可以使用preg_quote轻松地转义字符串中的所有分隔符和保留字符:
$expr = preg_quote('/hello', '/');
preg_match('/^'.$expr.'/', $str);
此外,PCRE支持各种修饰符。其中最常用的是不区分大小写的修饰符i,它是eregi的替代方法:
eregi('^hello', 'HELLO');
preg_match('/^hello/i', 'HELLO');
您可以在手册中找到PHP中对PCRE语法的完整参考,以及POSIX正则表达式和PCRE之间的差异列表,以帮助转换表达式。
但是,在您的简单示例中,您不会使用正则表达式:
stripos($str, 'hello world') === 0
精彩的解释!我只想添加一个特殊情况,你将从ereg转换为preg_match,你只需要转义分隔符而不是保留字符(因为它们已经作为特殊字符工作,我们不想逃避它们):preg_match(/ .str_replace(/, /,$ expr)。/,$ str);
特别值得注意的是,如果你使用匹配的括号,那么你不需要转义任何字符"只因为它与分隔符相同",就像你使用其他符号一样,例如^\hello示例。 (a(b)c)是完全有效的,分隔的PCRE。我个人喜欢使用括号()来提醒自己,第一次捕获的匹配就是整个事情。
我可以说,我讨厌讨厌PHP! (就是这样。没有别的。)当我的共享网络托管服务器更新到新版本并且error_log s满足这些警告时,我必须搜索这些答案:PHP Deprecated: Function ereg() is deprecated in...。哎呀!
怎么转换这个? $ regex = $ e。 ((。[^?? 。$ e。] ??[^。$ e。] ??)|(。。[^。$ e。] ??+)|([^ 。] [^。$ e。 ] *))。 $ e。 。。 。 $è;通过添加/修饰符/来preg_math它可以工作
使用preg替换Ereg(从PHP 5.3.0开始)对我们有利。
preg_match使用与Perl兼容的正则表达式语法,通常是ereg的更快替代品。
您应该知道将ereg模式移植到preg的4个主要内容:
添加分隔符(/):'pattern' =;gt; '/pattern/'
转义定界符,如果它是模式的一部分:'patt/ern' =;gt; '/patt\/ern/'
以下列方式以编程方式实现:
<5233>
$new_pattern = '/' . addcslashes($old_pattern, '/') . '/';
eregi(不区分大小写的匹配):'pattern' =;gt; '/pattern/i'
因此,如果您使用eregi函数进行不区分大小写的匹配,只需在新模式('/ pattern /')的末尾添加'i'。
ASCII值:在ereg中,如果在模式中使用数字,则假定您指的是字符的ASCII。但在preg中,number不被视为ASCII值。因此,如果您的模式在ereg表达式中包含ASCII值(例如:new line,tabs等),则将其转换为十六进制,并以 x为前缀。
Example: 9(tab) becomes \x9 or alternatively use \t.
ereg()和preg_replace()之间的差异比语法更多:
返回值:
出错:都返回FALSE
不匹配:ereg()返回FALSE,preg_match()返回0
匹配时:ereg()返回字符串长度或1,preg_match()始终返回1
得到的匹配子串数组:如果根本找不到某个子字符串((b) in ...a(b)?),ereg()结果中的相应项将是FALSE,而在preg_match()中则根本不会设置。
如果一个人没有勇气将他或她的ereg()转换为preg_match(),他或她可能会使用mb_ereg(),它仍然可以在PHP 7中使用。
从PHP 5.3版开始,不推荐使用ereg。
从ereg移动到preg_match只是我们模式的一个小变化。
首先,您必须在代码中添加分隔符,例如:
ereg('A-Z0-9a-z', 'string');
至
preg_match('/A-Z0-9a-z/', 'string');
对于eregi不区分大小写的匹配,请将i放在最后一个分隔符之后,例如:
eregi('pattern', 'string');
至
preg_match ('/pattern/i', 'string');