PHP-';包装'<;a>;在任何<;img>;标记


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

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

例如

$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类的对象无法转换为字符串

你知道我哪里错了吗?

使用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);
}
$content是一个无法转换为字符串的对象
要测试它,请使用var_dump($content);
你不能直接回显它。
使用DOM提供的属性和方法,您可以从这里获得:DOM元素

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

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

我认为这里的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;

希望这有帮助:)