代码之家  ›  专栏  ›  技术社区  ›  bryan kennedy

为什么这个标准的Reg-Ex不能在PHP的ereg函数中工作

  •  1
  • bryan kennedy  · 技术社区  · 16 年前

    我对Reg-Ex有点生疏,不完全理解不同口味之间的区别。但是,当我通过UNIX系统(vi和grep)尝试使用它时,我有一个基本的Reg-Ex,但当我尝试在PHP的ereg函数中使用它时,它就不起作用了。我怀疑PHP ereg函数的某些不同之处使其无法工作:

    <?php
    $string = 'Feugiat <em>hendrerit</em> sit iriuredolor aliquam.';
    $string = ereg_replace("<em\b[^>]*>(.*?)</em>","\\1",$string);
    echo $string;
    ?>
    

    我想这个输出 Feugiat hendrerit坐在iriuredolor aliquam。 没有em标签。但是,它只返回一个空字符串。

    8 回复  |  直到 16 年前
        1
  •  4
  •   Greg Hewgill    16 年前

    $string = ereg_replace("<em\\b[^>]*>(.*?)</em>","\\1",$string);
    

    这是因为 \b 在PHP中,字符串表示与 \b 在正则表达式中。使用 \\ 在PHP中,字符串通过单个反斜杠传递到 ereg_replace() . 这与您需要在替换字符串中使用双反斜杠的原因相同 "\\1" .

    $string 不包含任何 <em> 标签。在这种情况下,上述语句将导致一个空字符串,这可能不是您想要的。

        2
  •  2
  •   Eric    16 年前

    如果使用正则表达式只是为了删除html标记,那么php的strip_tags()函数可能更合适。

    php.net manual entry

        3
  •  2
  •   mcrumley    16 年前

    ereg_replace不支持单词边界断言(\b)或非贪婪修饰符(*?)。PEZ是对的,您可能应该使用preg。

    preg_replace('!<em\\b[^>]*>(.*?)</em>!', '$1', $string)
    

    额外的反斜杠并不是绝对必要的,因为PHP不会替换\b,但最好总是用字符串文字转义反斜杠。

        4
  •  2
  •   charlesbridge    16 年前

    ereg this .

    支持可移植操作系统接口(POSIX)正则表达式的ereg扩展正在从核心PHP支持中删除。

        5
  •  1
  •   Jan Goyvaerts    16 年前

    POSIX ERE . 我的 flavor comparison 表明这种风味与现代风味相比所缺乏的一切。

    您的解决方案是使用preg函数:

    preg_replace('!<em\b[^>]*>(.*?)</em>!', '$1', $string);
    

        6
  •  1
  •   Community kfsone    7 年前

    <em> 根据您的意图,我建议如下:

    <?php
      $string = 'Feugiat <em>hendrerit</em> sit iriuredolor aliquam.';
      $string = ereg_replace("</?em\\b[^>]*>", "", $string);
      echo $string;
    ?>
    

    Greg Hewgill

        7
  •  1
  •   PEZ    16 年前

    我从来都不懂ereg_uu,总是使用preg。如果像Greg建议的那样添加反斜杠并更改为preg_uu,它将编译。

    $string = preg_replace('%<em\\b[^>]*>(.*?)</em>%','\\1',$string);
    

    编辑:我同意这里的其他人的观点,这种特殊的方法可能不适合解决这个问题。但是,在PHP中使用正则表达式时,preg_uu仍然是最常用的方法。

        8
  •  1
  •   Calyth    16 年前

    据我所知,ereg不处理\b边界内容,而preg处理。 此外,我认为正则表达式上的双引号可能会导致反斜杠出现问题