由于自 PHP 5.3.0 起不推荐使用POSIX 正则表达式 (ereg),我想知道一种将旧表达式转换为PCRE (Perl Compatible Regular Expressions) (preg)的简单方法。
例如,我有这个正则表达式:
eregi('^hello world');
如何将表达式翻译成preg_match
兼容的表达式?
注意:此帖子用作与从 ereg 到 preg 转换相关的所有帖子的占位符,并作为相关问题的重复选项。请不要关闭这个问题。
有关的:
由于自 PHP 5.3.0 起不推荐使用POSIX 正则表达式 (ereg),我想知道一种将旧表达式转换为PCRE (Perl Compatible Regular Expressions) (preg)的简单方法。
例如,我有这个正则表达式:
eregi('^hello world');
如何将表达式翻译成preg_match
兼容的表达式?
注意:此帖子用作与从 ereg 到 preg 转换相关的所有帖子的占位符,并作为相关问题的重复选项。请不要关闭这个问题。
有关的:
语法上最大的变化是添加了分隔符。
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 支持各种事物的修饰符。最常用的修饰符之一是不区分大小写的修饰符,它是eregii
的替代品:
eregi('^hello', 'HELLO');
preg_match('/^hello/i', 'HELLO');
您可以在手册中找到 PHP 中 PCRE 语法的完整参考,以及POSIX 正则表达式和 PCRE 之间的差异列表,以帮助转换表达式。
但是,在您的简单示例中,您不会使用正则表达式:
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 = '<div>.+</div>';
$new_pattern = '/' . addcslashes($old_pattern, '/') . '/';
eregi(不区分大小写匹配):'pattern' => '/pattern/i'
因此,如果您使用eregi 函数进行不区分大小写的匹配,只需在新模式('/pattern/')的末尾添加'i'。
ASCII 值:在 ereg 中,如果您在模式中使用数字,则假定您指的是字符的 ASCII。但在 preg 中,数字不被视为 ASCII 值。因此,如果您的模式在 ereg 表达式中包含 ASCII 值(例如:新行、制表符等),则将其转换为十六进制并在其前面加上 \x。
Example: 9(tab) becomes \x9 or alternatively use \t.
从 PHP 5.3 版开始,ereg
已弃用。
从ereg
to移动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
匹配子字符串的结果数组:如果根本没有找到某个子字符串((b)
in ),则result...a(b)?
中的对应项将为,而 in则根本不会设置。ereg()
FALSE
preg_match()
如果一个人没有足够的勇气将他或她转换ereg()
为preg_match()
,他或她可以使用mb_ereg(),它在 PHP 7 中仍然可用。