在P标签内preg_replace目标图像

时间:2017-05-14 12:48:25

标签: php preg-replace

我使用preg_replace来更改某些内容,我有2种不同类型的图片......

<p>
    <img class="responsive" src="image.jpg">
</p>

<div class="caption">
    <img class="responsive" src="image2.jpg">
</div>

我正在使用这样的preg_replace在图像周围添加容器div ...

function filter_content($content)
    {
        $pattern = '/(<img[^>]*class=\"([^>]*?)\"[^>]*>)/i';
        $replacement = '<div class="inner $2">$1</div>';
        $content = preg_replace($pattern, $replacement, $content);
        return $content;
    }

有没有办法修改它以便它只影响P标签中的图像?反之亦然,所以我也可以在标题div中定位图像?

2 个答案:

答案 0 :(得分:2)

绝对

$dom = new DOMDocument();
$dom->loadHTML("<body><!-- DOMSTART -->".$content."<!-- DOMEND --></body>");
$xpath = new DOMXPath($dom);
$images = $xpath->query("//p/img");
foreach($images as $img) {
    $wrap = $dom->createElement("div");
    $wrap->setAttribute("class","inner ".$img->getAttribute("class"));
    $img->parentNode->replaceChild($wrap,$img);
    $wrap->appendChild($img);
}
$out = $dom->saveHTML();
preg_match("/<!-- DOMSTART -->(.*)<!-- DOMEND -->/s",$out,$match);
return $match[1];

值得注意的是,使用正则表达式解析任意HTML是一个等待发生的灾难,使用带标记的解析器然后根据这些标记进行匹配是非常安全的。

根据需要调整XPath查询和/或内部操作。

答案 1 :(得分:2)

使用html解析器而不是正则表达式,例如DOMDocument,即:

$html = <<< EOF
<p>
    <img class="responsive" src="image.jpg">
</p>
<div class="caption">
    <img class="responsive" src="image2.jpg">
</div>
EOF;

libxml_use_internal_errors(true);
$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$images = $xpath->query('//p/img[contains(@class,"responsive")]');
$new_src_url = "some_image_name.jpg";
foreach($images as $image)
{
    $image->setAttribute('src', $new_src_url);
    $dom->saveHTML($tag);
}