PHP - «обернуть» тег <a>вокруг любого тега <img>в строке - PullRequest
0 голосов
/ 30 января 2012

Мне нужно взять любой тег 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

Это дает мне следующую ошибку: Catchable fatal error: объект класса DOMElement не может быть преобразован в строку

Любые идеи о том, где я 'я иду не так?

Ответы [ 4 ]

2 голосов
/ 30 января 2012

С 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);
}
0 голосов
/ 30 января 2012

Я думаю, что здесь 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;

Надеюсь, это поможет:)

0 голосов
/ 30 января 2012

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); 
}
0 голосов
/ 30 января 2012

$ content - это объект, который нельзя преобразовать в строку.
чтобы проверить это, используйте var_dump($content);
Вы не можете напрямую повторить это.
Использовать свойства и методы, которые предлагает DOM, вы можете здесь: DOM Elements

...