将img src转换为href

时间:2013-11-05 19:48:38

标签: php regex image lightbox

我需要一些帮助才能在PHP中使用它。

我在wordpress中的不同“页面”中有很多信息和图片。现在我无法弄清楚应该如何解决这个问题。

我在“页面文字”

中直接有很多这样的图像
<img src="..." />

我需要更换它,以便它变成

<a href="content of img src" data-lightbox="image-1"><img src="..." /></a>

我认为有一些方法可以通过一些我知之甚少的正则表达来解决这个问题。

在此先感谢,即使你无法解决问题,也许你可以指出我正确的方向。 “页面”中最多可以有4-5张图像。

2 个答案:

答案 0 :(得分:0)

您可以使用PHP DOMDocument。使用正则表达式也可以,但使用此方法可以获得更好的成功。

$dom = new DOMDocument();
$dom->loadHTML($html); // $html is your "page text"

//Create new wrapper
$new_anchor = $dom->createElement('a');
$new_anchor->setAttribute('data-lightbox','image-1');

//Find all images
$images = $dom->getElementsByTagName('img');

//Iterate though images
foreach ($images AS $image) {
    //Clone our created anchor
    $new_anchor_clone = $new_anchor->cloneNode();
    //Add on the src
    $new_anchor_clone->setAttribute('href',$image->getAttribute('src'));
    //Replace image with this anchor
    $image->parentNode->replaceChild($new_anchor_clone,$image);
    //Append this image to wrapper anchor
    $new_anchor_clone->appendChild($image);
}

答案 1 :(得分:0)

正如我在你的评论中所说,你可以采取一些措施来解决这个问题。我将展示如何使用正则表达式,显然您必须改进以适应您的问题。为了使用正则表达式,您必须确定要替换的模式,因为如果img标记中的任何一个与您的模式不匹配,那么将不会替换该模式。所以我做了一个小例子:

$content = "
<html>
  <body>
    <img src='myImg.jpg'/><br/>
    <img src='myImg2.jpg'/><br/>
    <img src='myImg3.jpg'/><br/>
    <img src='myImg4.jpg'/><br/>
    <img src='myImg5.jpg'/><br/>
    <img src='myImg6.jpg'/><br/>
  </body>
</html>
";

$newContent = preg_replace( "/(<img src=')([^']*)('\/>)/", "<a href='$2'>$1$2$3</a>", $content);
echo $newContent;

正如您在$content变量中看到的那样,img标签遵循相同的模式,这样可以更轻松地创建R.E.

"/(<img src=')([^']*)('\/>)/" parentesis识别组(用于替换后者)第一种模式识别<img src=',第二部分([^']*)我说:永远这不是一个单一的引用和第三部分我从结束引用('\/>)开始到结束标记img。

每次进行治疗都意味着一个内部接受从左到右计数的数组,所以:

(<img src=') group 1
([^']*) group 2
('\/>) group 3

在img标签中:<img src='myImg3.jpg'/>它将是:

group 1 = <img src='
group 2 = myImg3.jpg
group 3 = '/>

$n命令将此组命名为preg_replace,并说明文档:preg_replace

然后我替换为"<a href='$2'>$1$2$3</a>",这是自我解释的。

为了学习和测试你的正则表达式使用这个Site我喜欢它,因为你可以粘贴文本并创建你的模式,看看动态发生了什么。如果您的模式匹配,它将以蓝色背景显示事件。

所以,让我知道它是否对你有所帮助。对于迟到的回复感到抱歉。