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

2022-08-30 06:49:14

由于POSIX正则表达式(ereg)自PHP 5.3.0以来已被弃用,我想知道一种将旧表达式转换为PCRE(Perl兼容正则表达式)(preg)的简单方法。

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

eregi('^hello world');

如何将表达式转换为兼容的表达式?preg_match

注意:此帖子用作与从 ereg 转换为 preg 相关的所有帖子的占位符,并作为相关问题的重复选项。请不要关闭这个问题。

相关:


答案 1

语法中最大的变化是添加了分隔符

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还支持各种事物的修饰符。其中最常用的是不区分大小写的修饰符,eregi 的替代词:i

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

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

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

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

答案 2

用 preg 替换 Ereg(从 PHP 5.3.0 开始)是正确的举动,对我们有利。

preg_match使用与Perl兼容的正则表达式语法,通常是erg的更快替代方案。

您应该知道将 ereg 模式移植到 preg 的 4 个主要事项:

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

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

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

  4. ASCII 值:在 ereg 中,如果在模式中使用数字,则假定您指的是字符的 ASCII。但在 preg 中,数字不被视为 ASCII 值。因此,如果您的模式在 ereg 表达式中包含 ASCII 值(例如:换行符、制表符等),则将其转换为十六进制,并在其前面加上 \x 前缀。
    Example: 9(tab) becomes \x9 or alternatively use \t.


推荐