php ereg preg,如何在PHP中将ereg表达式转换为preg?

由于自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');

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值