如何在 PHP 中将 ereg 表达式转换为 preg?

由于 POSIX 正则表达式(ereg)在 PHP5.3.0之后就被弃用了,我想知道一种将旧表达式转换为 与 Perl 兼容的正则表达式(preg)的简单方法。

例如,我有这个正则表达式:

eregi('^hello world');

如何将表达式翻译成与 preg_match兼容的表达式?

注意: 这篇文章作为一个占位符的所有职位相关的转换,从脑电图转换为怀孕,并作为一个重复的选项相关的问题。请不要关闭这个问题。

相关阅读:

73828 次浏览

语法中最大的变化是增加了 分界线

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);

您可以使用 翻译轻松地转义字符串中的所有分隔符和保留字符:

$expr = preg_quote('/hello', '/');
preg_match('/^'.$expr.'/', $str);

此外,PCRE 支持 修饰语的各种事情。最常用的修饰语之一是不区分大小写的 i,它是 谢谢的替代品:

eregi('^hello', 'HELLO');
preg_match('/^hello/i', 'HELLO');

您可以找到对 在 PHP 中的 PCRE 语法在手册中的完整引用,以及 POSIX 正则表达式和 PCRE 之间的 差异清单,以帮助转换表达式。

但是,在您的简单示例中,您不会使用正则表达式:

stripos($str, 'hello world') === 0

Ereg 替换为 preg (从 PHP5.3.0开始)是对我们有利的一步。

Preg _ match 使用与 Perl 兼容的正则表达式语法,通常比 ereg 更快。

你应该知道4个主要的事情来移植脑电图模式来预防:

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

  2. 转义分隔符 如果它是模式的一部分: 'patt/ern' => '/patt\/ern/'
    通过以下方式在方案中实现这一目标:
    $old_pattern = '<div>.+</div>';
    $new_pattern = '/' . addcslashes($old_pattern, '/') . '/';

  3. Eregi (不区分大小写的匹配) : 'pattern' => '/pattern/i' 因此,如果您使用 eregi 函数进行不区分大小写的匹配,只需在 new pattern (’/pattern/’)的末尾添加“ i”即可。

  4. ASCII 值 : 在 ereg 中,如果在模式中使用 number,则假定您指的是字符的 ASCII。但是在 preg 中,number 不作为 ASCII 值处理。因此,如果您的模式在 ereg 表达式中包含 ASCII 值(例如: new line,tab 等) ,那么将其转换为十六进制,并以 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
    • 在 no match : ereg()返回 FALSEpreg_match()返回 0
    • 在 match : ereg()返回字符串长度或 1时,preg_match()始终返回 1
  • 生成匹配子字符串的数组: 如果根本没有找到某个子字符串(...a(b)?中的 (b)) ,则 ereg()结果中的对应项将是 FALSE,而在 preg_match()中则根本不会设置它。

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