代码之家  ›  专栏  ›  技术社区  ›  slik

PHP preg\u替换使regex可选?

  •  3
  • slik  · 技术社区  · 15 年前

    我有一些我正在尝试解析的内容。。。

    我有html,在html中我想用一个自定义字符串替换所有img标记。现在我遇到的一个问题是,一些内容进来了:图像标签在锚之间。

    <a href="link"><img></a>
    

    下面的代码我有作品…但我希望它是可选的,所以在案件没有锚标记是由一个img标记包围有任何良好的资源在regex或可以帮助我吗?

    谢谢您!

    $content = preg_replace('#<a.*?>'.$image_tag.'</a>#i', "{$image_id}", $content);
    
    2 回复  |  直到 15 年前
        1
  •  4
  •   Mark Byers    15 年前
    • 令牌后面的问号使该令牌成为可选的。
    • (?...) 将多个令牌分组(不创建捕获组)。
    • 把这些结合起来, (?...)?

    所以你可以这样做:

    $content = preg_replace('#(?:<a.*?>)?'.$image_tag.'(?:</a>)?#i',
                            "{$image_id}",
                            $content);
    

    您可能还想看看不基于正则表达式的替代解决方案,例如使用HTML解析器。

        2
  •  2
  •   Doktor J    15 年前

    有什么原因吗

    $content = preg_replace('#'.$image_tag.'#i', "{$image_id}", $content);
    

    不起作用?如果您的正则表达式上没有“^”和“$”锚点,它应该只搜索 $image\u标签 数据中的任何位置,无论是否被<a>标签。如果不起作用,可以尝试:

    $content = preg_replace('#(<a.*?>)?'.$image_tag.'(</a>)?#i', "{$image_id}", $content);
    

    这使得<a>和</a>标记到子模式中,后跟 修饰语(即子模式可能出现0或1次)