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

net*_*der 135 php pcre preg-replace preg-match ereg

由于自PHP 5.3.0以来不推荐使用POSIX正则表达式(ereg),因此我想知道将旧表达式转换为PCRE(Perl兼容正则表达式)(preg)的简单方法.

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

eregi('^hello world');
Run Code Online (Sandbox Code Playgroud)

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

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

有关:

net*_*der 135

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

ereg('^hello', $str);
preg_match('/^hello/', $str);
Run Code Online (Sandbox Code Playgroud)

分隔符可以是几乎不是字母数字,反斜杠或空白字符的任何东西.最常用的是~,/#.

您还可以使用匹配的括号:

preg_match('[^hello]', $str);
preg_match('(^hello)', $str);
preg_match('{^hello}', $str);
// etc
Run Code Online (Sandbox Code Playgroud)

如果在正则表达式中找到了分隔符,则必须将其转义:

ereg('^/hello', $str);
preg_match('/^\/hello/', $str);
Run Code Online (Sandbox Code Playgroud)

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

$expr = preg_quote('/hello', '/');
preg_match('/^'.$expr.'/', $str);
Run Code Online (Sandbox Code Playgroud)

此外,PCRE支持各种修饰符.其中最常用的是不区分大小写的修饰符i,它是eregi的替代方法:

eregi('^hello', 'HELLO');
preg_match('/^hello/i', 'HELLO');
Run Code Online (Sandbox Code Playgroud)

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

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

stripos($str, 'hello world') === 0
Run Code Online (Sandbox Code Playgroud)

  • 精彩的解释!我只想添加一个特殊情况,你将从__ereg__转换为__preg_match__,你只需要转义分隔符而不是保留字符(因为它们已经作为特殊字符工作,我们不想逃避它们) :**preg_match('/'.str_replace('/','\ /',$ expr).'/',$ str);** (2认同)

Sum*_*and 31

使用preg替换Ereg(从PHP 5.3.0开始)对我们有利.

preg_match使用与Perl兼容的正则表达式语法,通常是ereg的更快替代品.

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

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

  2. Escape分隔符,如果它是模式的一部分:'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中,number不被视为ASCII值.因此,如果您的模式在ereg表达式中包含ASCII值(例如:new line,tabs等),则将其转换为十六进制,并以\ x为前缀.
    Example: 9(tab) becomes \x9 or alternatively use \t.


Nar*_*yan 7

从PHP 5.3版开始,ereg不推荐使用.

从那里ereg开始preg_match只是我们模式的一个小变化.

首先,您必须在代码中添加分隔符,例如:

ereg('A-Z0-9a-z', 'string');
Run Code Online (Sandbox Code Playgroud)

preg_match('/A-Z0-9a-z/', 'string');
Run Code Online (Sandbox Code Playgroud)

对于eregi不区分大小写的匹配,请放在i最后一个分隔符之后,例如:

eregi('pattern', 'string');
Run Code Online (Sandbox Code Playgroud)

preg_match ('/pattern/i', 'string');
Run Code Online (Sandbox Code Playgroud)


Rom*_*cke 7

还有更多的之间的差异ereg(),并preg_replace()不仅仅是语法:

  • 返回值:

    • 出错:两人都回来了FALSE
    • 不匹配:ereg()返回FALSE,preg_match()返回0
    • 在匹配时:ereg()返回字符串长度或1,preg_match()始终返回1
  • 得到的匹配子串的数组:如果根本找不到某个子串((b)in ...a(b)?),则ereg()结果中的相应项将是FALSE,而在preg_match()其中根本不会设置.

如果一个人没有勇气将他或她转换ereg()preg_match(),他或她可能会使用mb_ereg(),这在PHP 7中仍然可用.