让我们说(在php中)我们有一个包含文本,链接和图像的变量:
<a href="myimage_big"><img src="myimage.jpg" alt="pic" title="pic" border="0" /></a>
我们希望在每个href标签中添加rel =“light”,如下所示:
<a rel="lightbox" href="myimage_big"><img src="myimage.jpg" alt="pic" title="pic" border="0" /></a>
如果变量的名称是 $ mydata ,那么使用str_replace我们可以按照以下方式解决我们的问题:
$mydata = str_replace('<img ', '<img rel="lightbox"', $mydata);
直到这里没事,但是其余的href链接不包括任何照片:
例如,
<a href="link1.php">link_no1</a>
<a href="link2.php">link_no2</a>
等等?对于这种不包含任何图像但是文本然后使用我们的str_replace代码的链接也会有一个不正确的rel =“lightbox”属性,我不想要:
<a rel="lightbox" href="link1.php">link_no1</a>
那么我们如何将rel =“lightbox”仅应用于包含某些图片的链接以及那些不包含任何图片的链接,以便不设置rel =“lightbox”属性..!?
答案 0 :(得分:2)
这个正则表达式是否解决了这个问题?
$str = '<a href="myimage_big"><img src="myimage.jpg" /></a>';
$str = preg_replace('~<a(?=[^>]+>\s*<img)~','<a rel="lightbox"',$str);
echo htmlspecialchars($str);
使用lookahead检查<a ...>
是否后跟<img
答案 1 :(得分:2)
如果您更喜欢使用正则表达式...
$html = preg_replace('/(?<=<a)(?=[^>]*>[^<]*<img)/', ' rel="lightbox"', $html);
虽然,我会考虑使用DOM和 XPath ...
$doc = DOMDocument::loadHTML('
<a href="myimage_big"><img src="myimage.jpg" alt="pic" title="pic" border="0" /></a>
<a href="link1.php">link_no1</a>
<a href="link2.php">link_no2</a>
<a href="image.jpg"><img src="image1.jpg"></a>
');
$xpath = new DOMXPath($doc);
$links = $xpath->query('//a//img');
foreach($links as $link) {
$link->parentNode->setAttribute('rel', 'lightbox');
}
echo $doc->saveHTML();