如何将eregexpression式转换为PHP中的preg?
由于POSIX正则expression式(ereg)从PHP 5.3.0开始不推荐,我想知道一个简单的方法来将旧的expression式转换为PCRE(Perl Compatible Regular Expressions)(preg) 。
举例来说,我有这个正则expression式:
eregi('^hello world');
如何将expression式转换为preg_match
兼容expression式?
注意:这篇文章是所有与从ereg转换到preg相关的post的占位符,也是相关问题的重复选项。 请不要closures这个问题。
有关:
- 如何将PHP的eregi更改为preg_match
- 将ereg_replace更改为等同的preg_replace
语法上最大的变化是增加了分隔符 。
ereg('^hello', $str); preg_match('/^hello/', $str);
分隔符几乎可以是任何不是字母数字,反斜线或空白字符的东西。 最常用的是~
, /
和#
。
您也可以使用匹配括号:
preg_match('[^hello]', $str); preg_match('(^hello)', $str); preg_match('{^hello}', $str); // etc
如果在正则expression式中find您的分隔符,则必须将其转义:
ereg('^/hello', $str); preg_match('/^\/hello/', $str);
您可以使用preg_quote轻松地转义string中的所有分隔符和保留字符:
$expr = preg_quote('/hello', '/'); preg_match('/^'.$expr.'/', $str);
另外,PCRE支持各种各样的修饰符 。 其中最常用的是不区分大小写的修饰符i
, eregi的替代方法:
eregi('^hello', 'HELLO'); preg_match('/^hello/i', 'HELLO');
您可以在手册中findPHP中完整的PCRE语法参考,以及POSIX正则expression式和PCRE之间的差异列表,以帮助转换expression式。
但是,在你的简单例子中,你不会使用正则expression式:
stripos($str, 'hello world') === 0
用pregreplaceEreg(截至PHP 5.3.0)对我们有利。
使用Perl兼容的正则expression式语法的preg_match通常是ereg的一个更快的select。
你应该知道4个主要的东西来移植ereg模式preg:
-
添加分隔符 (/):
'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值。 因此,如果您的模式在eregexpression式中包含ASCII值(例如:新行,标签等),那么将其转换为hex,并用\ x作为前缀。
Example: 9(tab) becomes \x9 or alternatively use \t.
从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()
返回string长度或1
,preg_match()
总是返回1
- 在错误 :都返回
-
(b)
in...a(b)?
),ereg()
结果中的相应项目将为FALSE
,而在preg_match()
则不会设置在所有。
如果没有足够的勇气将他或她的ereg()
转换为preg_match()
,他或她可以使用mb_ereg() ,这在PHP 7中仍然可用。