PHP preg_替换使正则表达式可选?

PHP preg_替换使正则表达式可选?,php,regex,parsing,preg-replace,Php,Regex,Parsing,Preg Replace,我有一些我正试图解析的内容 我有html,在html中我想用一个自定义字符串替换我的所有img标记。现在我遇到的一个问题是,一些内容进来了:图像标签在一个锚之间 前 下面的代码我有作品…但我希望它是可选的,所以在没有锚标记是由一个img标记包围的情况下,有没有人有任何关于regex的好资源或可以帮助我 谢谢大家! $content = preg_replace('#<a.*?>'.$image_tag.'</a>#i', "{$image_id}", $content

我有一些我正试图解析的内容

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


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

谢谢大家!

$content = preg_replace('#<a.*?>'.$image_tag.'</a>#i', "{$image_id}", $content);
$content=preg_replace('#'.$image_tag'.#i',“{$image_id},$content);
  • 标记后的问号使该标记成为可选标记
  • 使用
    (?…)
    将多个令牌分组(不创建捕获组)
  • 将这些组合在一起,
    (?…)?
    使组成为可选组
所以你可以这样做:

$content = preg_replace('#(?:<a.*?>)?'.$image_tag.'(?:</a>)?#i',
                        "{$image_id}",
                        $content);
$content=preg#u replace(“#(?:)?”.$image_tag.“(?:)?#i”,
“{$image_id}”,
$content);
您可能还想看看不基于正则表达式的替代解决方案,例如使用HTML解析器。

有什么原因吗

$content = preg_replace('#'.$image_tag.'#i', "{$image_id}", $content);
不管用吗?如果正则表达式上没有“^”和“$”锚点,则它应该只在数据中的任何位置搜索$image\u标记,无论是否被标记包围。如果不起作用,可以尝试:

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

这使得和标记成为子模式,后跟修饰符(即子模式可能出现0或1次)

HTML不是一种正则语言,因此不适合正则表达式。使用DOM/HTML解析器。它们使用起来很简单,不再是。。。所以我们真的应该为正则表达式设置一个html解析问题的自动响应程序。
$content = preg_replace('#(<a.*?>)?'.$image_tag.'(</a>)?#i', "{$image_id}", $content);