2011-06-07 108 views
109

由于POSIX regular expressions (ereg)自PHP 5.3.0起已弃用,我想知道一种简单的方法将旧表达式转换为PCRE (Perl Compatible Regular Expressions) (preg)如何将ereg表达式转换为PHP中的preg?

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

eregi('^hello world'); 

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

注:这篇文章作为从额日格至预浸涉及转换的所有帖子的占位符,并为相关问题的复制选项。请不要关闭此问题。

相关:

+2

AGAIN?哦,我的上帝在过去十分钟里也有同样的问题 – dynamic 2011-06-07 18:37:51

+2

@ yes123:是的,就是这一点,我也厌倦了。我想要一个实际解释某些内容的wiki文章,以便我们可以关闭所有这些单独的问题。 – netcoder 2011-06-07 18:38:43

+0

我认为不需要这个,因为你只需要用分隔符来包装旧的。此外,我认为你可以使用此前回答的问题。 – dynamic 2011-06-07 18:39:02

回答

106

在语法上最大的变化就是增加了delimiters

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支持各种东西的modifiers。其中最常用的是不区分大小写的修饰符i,则替代eregi

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

你可以找到完整的参考PCRE syntax in PHP in the manual,以及POSIX正则表达式和PCRE之间的list of differences帮助转换表达。

然而,在简单的例子,你不会使用正则表达式:

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

好的答案,并且可能是我在这个主题上看到的更好的一个,为什么使它成为CW? – Kev 2011-06-07 19:01:52

+1

精彩的解释!我只想添加一个特殊情况,在这种情况下,您正在将__ereg__转换为__preg_match__,并且只需要转义分隔符而不是保留字符(因为它们已经作为特殊字符工作,我们不想转义它们) :** preg_match('/'。str_replace('/','\ /',$ expr)。'/',$ str); ** – Lolito 2013-11-05 10:04:28

+0

特别值得注意的是,如果您使用了匹配的括号,那么您* '*不需要转义任何字符“,因为它与分隔符相同”,就像你对其他符号使用'/^\/hello /'示例一样。 '(a(b)c)'是完全有效的,划定的PCRE。我个人喜欢使用括号'()'来提醒自己,第一个捕获的匹配是整个事情。 – 2017-03-28 09:59:22

23

EREG置换预浸料(如PHP 5.3.0的)是有利于我们正确的举措。

使用Perl兼容的正则表达式语法的preg_match通常是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函数的情况下insenstive匹配,只要加入 'i' 的新格局的结束('/模式/')。

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

2

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

2

ereg()preg_replace()之间更多的不同不仅仅是语法:

  • 返回值:

    • 在错误:都返回FALSE
    • 上没有匹配ereg()回报FALSEpreg_match()返回0
    • 在比赛ereg()返回字符串的长度或1preg_match()回报总是1
  • 结果g匹配的子串数组:如果根本找不到某个子串((b),...a(b)?),则ereg()结果中的对应项目将为FALSE,而在preg_match()中则根本不会设置。

如果一个人没有足够的勇气来转换他或她ereg()preg_match(),他或她可以使用mb_ereg(),它仍然是提供PHP 7