如何将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:

  1. 添加分隔符 (/): 'pattern' => '/pattern/'

  2. 如果它是模式的一部分,则跳过分隔符'patt/ern' => '/patt\/ern/'
    通过以下方式编程实现:
    $old_pattern = '<div>.+</div>';
    $new_pattern = '/' . addcslashes($old_pattern, '/') . '/';

  3. eregi (区分大小写的匹配): 'pattern' => '/pattern/i'所以,如果你使用eregi函数进行不区分大小写的匹配,只需要在新模式('/ pattern /')的末尾添加'i' 。

  4. 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()返回FALSEpreg_match()返回0
    • 匹配ereg()返回string长度或1preg_match()总是返回1
  • (b) in ...a(b)? ), ereg()结果中的相应项目将为FALSE ,而在preg_match()则不会设置在所有。

如果没有足够的勇气将他或她的ereg()转换为preg_match() ,他或她可以使用mb_ereg() ,这在PHP 7中仍然可用。