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

如何在PHP中将ereg表达式转换为preg?,php,preg-replace,preg-match,pcre,ereg,Php,Preg Replace,Preg Match,Pcre,Ereg,由于自PHP5.3.0以来就不推荐使用这些表达式,我想知道一种将旧表达式转换为的简单方法 例如,我有一个正则表达式: eregi('^hello world'); stripos($str, 'hello world') === 0 如何将表达式转换为兼容的表达式 注意:此帖子作为从ereg转换为preg的所有帖子的占位符,并作为相关问题的重复选项。请不要关闭此问题 相关: 语法中最大的变化是添加了 分隔符可以是几乎任何不是字母数字、反斜杠或空白字符的东西。通常使用最多的是~、/和

由于自PHP5.3.0以来就不推荐使用这些表达式,我想知道一种将旧表达式转换为的简单方法

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

eregi('^hello world');
stripos($str, 'hello world') === 0
如何将表达式转换为兼容的表达式

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

相关:


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

分隔符可以是几乎任何不是字母数字、反斜杠或空白字符的东西。通常使用最多的是
~
/

也可以使用匹配的括号:

preg_match('[^hello]', $str);
preg_match('(^hello)', $str);
preg_match('{^hello}', $str);
// etc
如果在正则表达式中找到分隔符,则必须对其进行转义:

ereg('^/hello', $str);
preg_match('/^\/hello/', $str);
您可以使用以下命令轻松转义字符串中的所有分隔符和保留字符:

此外,PCRE还支持各种功能。最常用的一种是不区分大小写的修饰符
i
,它可以替代:

您可以找到对的完整引用,以及POSIX正则表达式和PCRE之间的连接,以帮助转换表达式

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

eregi('^hello world');
stripos($str, 'hello world') === 0
Ereg替换为preg(从PHP5.3.0开始)是对我们有利的正确举措

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

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

  • 添加分隔符(/):
    “模式”=>“/pattern/”

  • 转义分隔符如果它是模式的一部分:
    'patt/ern'=>'/patt\/ern/'

    通过以下方式编程实现:
    $old_pattern='.+'
    $new_pattern='/'。添加睫毛($old_pattern,“/”)。/”

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

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


  • 从PHP 5.3版开始,
    ereg
    已被弃用。

    ereg
    移动到
    preg\u match
    只是我们模式中的一个小变化

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

    ereg('A-Z0-9a-z', 'string');
    

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

    eregi('pattern', 'string');
    


    ereg()
    preg\u replace()
    之间的区别不仅仅在于语法:

    • 返回值:

      • On错误:两者都返回
        FALSE
      • 不匹配时:
        ereg()
        返回
        FALSE
        preg\u match()
        返回
        0
      • 匹配时:
        ereg()
        返回字符串长度或
        1
        preg\u match()
        始终返回
        1
    • 匹配子字符串的结果数组:如果在
      …a(b)
      中根本找不到某个子字符串(
      (b)
      ),则
      ereg()
      结果中的对应项将为
      FALSE
      ,而在
      preg\u match()
      中则根本不会设置它


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

    @yes123:是的,这就是重点,我也厌倦了。我想要一篇维基文章,实际上解释了一些东西,这样我们就可以结束所有这些单独的问题。我认为没有必要这样做,因为你只需要用一个分隔符来包装旧的问题。我还认为你可以用之前回答的问题来回答这个问题。啊,在阅读评论之前投票决定结束。作为一个占位符,它可以起到一定的作用,但难道没有另一个更老的问题可以起到同样的作用吗?嗯,的确
    ereg[php]
    不会产生很多有用的结果。好的,我可以支持这一点。伙计们,我们似乎已经在这个话题上创造了一个封闭的问题圈,所有的问题都指向对方。以这种速度,他们都会被关闭:)精彩的解释!我只想添加一个特殊情况,在这种情况下,您将从ereg转换为preg_匹配,并且只需要转义分隔符而不转义保留字符(因为它们已经作为特殊字符使用,我们不想转义它们):preg_匹配('/'.str_replace('/','\/',$expr)。'/',$str);特别值得注意的是,如果使用匹配括号,则不需要像使用其他符号(如
    /^\/hello/
    示例)那样“仅仅因为它与分隔符相同”而转义任何字符<代码>(a(b)c)
    是一个完全有效的、带分隔符的PCRE。我个人喜欢用括号
    ()
    来提醒自己,第一次捕获的匹配就是全部。如何转换$正则表达式=$e'(\..[^..$e.][^.$e.]*)|(\...[^..$e.]+)|([^.][^.$e.]*)。”$e.“\.\”$E只需添加/修改器,就可以进行预计算/
    preg_match('/A-Z0-9a-z/', 'string');
    
    eregi('pattern', 'string');
    
    preg_match ('/pattern/i', 'string');