由于自 PHP 5.3.0 起已弃用 POSIX regular expressions (ereg),我想知道一种将旧表达式转换为 PCRE (Perl Compatible Regular Expressions) (preg) 的简单方法。
例如,我有这个正则表达式:
eregi('^hello world');
如何将表达式转换为 preg_match
兼容的表达式?
注意:此帖子用作与从 ereg 到 preg 转换相关的所有帖子的占位符,并作为相关问题的重复选项。请不要关闭这个问题。相关:如何将 PHP 的 eregi 更改为 preg_match 将 ereg_replace 更改为等效的 preg_replace
ereg [php]
不会产生非常有用的结果。好的,可以支持一下这个。
语法的最大变化是添加了 delimiters。
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 支持 modifiers 处理各种事情。最常用的修饰符之一是不区分大小写的修饰符 i
,它是 eregi 的替代品:
eregi('^hello', 'HELLO');
preg_match('/^hello/i', 'HELLO');
您可以找到对 PCRE syntax in PHP in the manual 的完整引用,以及 POSIX 正则表达式和 PCRE 之间的 list of differences 以帮助转换表达式。
但是,在您的简单示例中,您不会使用正则表达式:
stripos($str, 'hello world') === 0
用 preg 替换 Ereg(从 PHP 5.3.0 开始)对我们有利。
preg_match 使用与 Perl 兼容的正则表达式语法,通常是 ereg 的更快替代方案。
您应该知道将 ereg 模式移植到 preg 的 4 个主要事项:
添加分隔符(/):'pattern' => '/pattern/' 如果它是模式的一部分,则转义分隔符:'patt/ern' => '/patt\/ern/' 通过以下方式以编程方式实现它:$ old_pattern = '
从 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');
ereg()
和 preg_replace()
之间的区别不仅仅在于语法:
返回值: 出错时:两者都返回 FALSE 不匹配时:ereg() 返回 FALSE,preg_match() 返回 0 匹配时:ereg() 返回字符串长度或 1,preg_match() 始终返回 1
出错时:两者都返回 FALSE
不匹配时:ereg() 返回 FALSE,preg_match() 返回 0
匹配时:ereg() 返回字符串长度或 1,preg_match() 始终返回 1
匹配子字符串的结果数组:如果根本没有找到某个子字符串(...a(b)中的(b)?),则ereg()结果中的相应项将为FALSE,而在preg_match()中则不会设置一点也不。
如果一个人没有足够的勇气将他或她的 ereg()
转换为 preg_match()
,他或她可以使用 mb_ereg(),它在 PHP 7 中仍然可用。
/^\/hello/
示例等其他符号所做的那样.(a(b)c)
是一个完全有效的分隔 PCRE。我个人喜欢用括号()
来提醒自己,第一个捕获的匹配就是整个事情。