如何将rel =“lightbox”仅添加到包含图像的链接而不是其他链接?

时间:2013-12-24 23:27:48

标签: php html regex image tags

让我们说(在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”属性..!?

2 个答案:

答案 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();