我有一个包含不同类型的html标签和内容的字符串,包括一些<img>
个元素。我试图将这些<img>
元素包含在<figure>
标记内。到目前为止使用这样的preg_replace非常好:
preg_replace( '/(<img.*?>)/s','<figure>$1</figure>',$content);
但是,如果<img>
标记具有相邻的<figcaption>
标记,则结果相当丑陋,并为图元素生成一个迷路结束标记:
<figure id="attachment_9615">
<img class="size-full" src="http://www.example.com/pic.png" alt="name" width="1699" height="354" />
<figcaption class="caption-text"></figure>Caption title here</figcaption>
</figure>
我已经尝试了一大堆preg_replace正则表达式变体来包装img-tag和figcaption-tag里面的图形,但似乎无法使它工作。
我的最新尝试:
preg_replace( '/(<img.*?>)(<figcaption .*>*.<\/figcaption>)?/s',
'<figure">$1$2</figure>',
$content);
答案 0 :(得分:2)
正如其他人指出的那样,更好地使用解析器,即The Big Bang Theory S09E15 X264-DIMENSION
。以下代码围绕每个DOMDocument
包围<figure>
标记,其中下一个兄弟是img
:
<figcaption>
要在图片的 所有 周围添加<?php
$html = <<<EOF
<html>
<img class="size-full" src="http://www.example.com/pic.png" alt="name" width="1699" height="354" />
<figcaption class="caption-text">Caption title here</figcaption>
<img class="size-full" src="http://www.example.com/pic.png" alt="name" width="1699" height="354" />
<img class="size-full" src="http://www.example.com/pic.png" alt="name" width="1699" height="354" />
<figcaption class="caption-text">Caption title here</figcaption>
</html>
EOF;
$dom = new DOMdocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
# get all images
$imgs = $xpath->query("//img");
foreach ($imgs as $img) {
if ($img->nextSibling->tagName == 'figcaption') {
# create a new figure tag and append the cloned elements
$figure = $dom->createElement('figure');
$figure->appendChild($img->cloneNode(true));
$figure->appendChild($img->nextSibling->cloneNode(true));
# insert the newly generated elements right before $img
$img->parentNode->insertBefore($figure, $img);
# and remove both the figcaption and the image from the DOM
$img->nextSibling->parentNode->removeChild($img->nextSibling);
$img->parentNode->removeChild($img);
}
}
$dom->formatOutput=true;
echo $dom->saveHTML();
标记,您可能需要添加<figure>
分支:
else