由于自PHP 5.3.0以来已弃用POSIX regular expressions (ereg),因此我想知道将旧表达式转换为PCRE (Perl Compatible Regular Expressions) (preg)的简便方法。
每个例子,我有这个正则表达式:
eregi('^hello world');
如何将表达式翻译成preg_match
兼容表达式?
注意:此帖子用作与从ereg转换为preg相关的所有帖子的占位符,以及相关问题的重复选项。请不要关闭此帖子问题
相关:
答案 0 :(得分:129)
语法中最大的变化是添加了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
答案 1 :(得分:30)
使用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函数进行不区分大小写的匹配,只需在新模式的末尾添加“i”('/ pattern /').
ASCII值:在ereg中,如果在模式中使用数字,则假定您指的是字符的ASCII。但在preg中,number不被视为ASCII值。因此,如果您的模式在ereg表达式中包含ASCII值(例如:new line,tabs等),则将其转换为十六进制,并以\ x为前缀。
Example: 9(tab) becomes \x9 or alternatively use \t.
答案 2 :(得分:7)
preg_replace()
和FALSE
之间的差异不仅仅是语法:
返回值:
ereg()
FALSE
返回preg_match()
,0
返回ereg()
1
返回字符串长度或preg_match()
,1
始终返回(b)
匹配的子串的结果数组:如果根本找不到某个子字符串(...a(b)?
中的ereg()
),则FALSE
结果中的相应项将为preg_match()
,在ereg()
中,它根本不会被设置。
如果一个人没有勇气将他或她的preg_match()
转换为if (min(test$SysDay)==1) { subset(test, DAY == 1 ) } else { test }
,他或她可以使用mb_ereg(),这仍然可以在PHP 7中使用。
答案 3 :(得分:6)
从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');