PHP - 'wrap'<a> tag around any <img/> tag within a string</a>

时间:2012-01-30 09:00:38

标签: php preg-replace domdocument

我需要在字符串中包含任何img标记,并在其周围添加一个标记。

E.g。

$content= "Click for more info <img src="\http://www.domain.com/1.jpg\"" />";

需要替换为

"Click for more info <a href=\"http://www.domain.com/1.jpg\"<img src="\http://www.domain.com/1.jpg\"" /></a>";

我目前的脚本是:

$content = $row_rsGetStudy['content'];

$doc = new DOMDocument();
$doc->loadHTML($content);
$imageTags = $doc->getElementsByTagName('img');

foreach($imageTags as $tag) {
    $content = preg_replace("/<img[^>]+\>/i", "<a href=\"$tag\"><img src=\"$tag\" /></a>", $content); 
}

echo $content

这给了我以下错误: 可捕获的致命错误:类DOMElement的对象无法转换为字符串

关于我哪里出错的任何想法?

4 个答案:

答案 0 :(得分:2)

使用DOM方法,这样的事情(未经测试,自己调试; P)

foreach($imageTags as $tag) {
    $a = $tag->ownerDocument->createElement('a');
    $added_a = $tag->parentNode->insertBefore($a,$tag);
    $added_a->setAttribute('href',$tag->getAttribute('src'));
    $added_a->appendChild($tag);
}

答案 1 :(得分:0)

$ content是一个无法转换为字符串的对象 要测试它,请使用var_dump($content);
你无法直接回应它 使用DOM提供的属性和方法,您可以从这里获得:DOM Elements

答案 2 :(得分:0)

getElementsByTagName返回包含所有匹配元素的DOMNodeList对象。所以$ tag在这里是DOMNodelist :: item,因此不能直接在字符串操作中使用。你需要获得nodeValue。更改foreach代码如下:

foreach($imageTags as $tag) {
    $content = preg_replace("/<img[^>]+\>/i", "<a href=\"$tag->nodeValue\"><img src=\"$tag->nodeValue\" /></a>", $content); 
}

答案 3 :(得分:0)

我认为这里DOMDocument没有从字符串加载HTML。一些奇怪的问题。我更喜欢使用DOM解析器,例如SimpleHTML

您可以像以下一样使用它:

  $content= 'Click for more info <img src="http://www.domain.com/1.jpg" />';

  require_once('simple_html_dom.php');

  $post_dom = str_get_html($content);

  $img_tags = $post_dom->find('img');

  $images = array();

  foreach($img_tags as $image) {
      $source = $image->attr['src'];
      $content = preg_replace("/<img[^>]+\>/i", "<a href=\"$source\"><img src=\"$source\" /></a>", $content); 
 }

 echo $content;

希望这会有所帮助:)