как изменить, а затем показать атрибуты в HTML с PHP - PullRequest
1 голос
/ 24 сентября 2019

в моей таблице есть строка, которая содержит строку, подобную этой:

<p>hello</p><p>this is patrick</p><p><img src="/assets/img/myface.jpg" width="320" height="320"/></p>

, и я хочу присвоить тегу <img> атрибут alt.Я уже достаточно близко, но каким-то образом мой код все еще показывает 2 <img> тегов, хотя в строке есть только 1. Может кто-нибудь сказать мне, что я делаю неправильно?

Это мой код до сих пор:

$str = '<p>hello</p><p>this is patrick</p><p><img src="/assets/img/myface.jpg" width="320" height="320"/></p>';
$new_html = '';
$dom = new DOMDocument();
$dom->loadHTML($str);
$content = $dom->getElementsByTagName('*');
foreach ($content as $i => $node)
{
  if ($node->nodeName == 'html' || $node->nodeName == 'body')
  {
    continue; // dont need to process these tags, right?
  }

  if ($node->nodeName == 'img')
  {
    $img_src = $node->getAttribute('src');
    $path_arr = explode('/', $img_src);
    $filename = $path_arr[count($path_arr)-1]; // myface.jpg

    $alt = 'blah';
    $node->setAttribute('alt', $alt);
  }

  echo $dom->saveXML($node);
}

Ответы [ 3 ]

2 голосов
/ 24 сентября 2019
$content = $dom->getElementsByTagName('img');
foreach ($content as $node) {
    $img_src = $node->getAttribute('src');
    $filename = basename($img_src);

    $node->setAttribute('alt', $filename);
}

echo $dom->saveHTML();

Цикл только для изображений с $content = $dom->getElementsByTagName('img');

Перемещение $dom->saveHTML(); после lthe цикла.

Получить имя файла с $filename = basename($img_src);

1 голос
/ 24 сентября 2019

Проблема в том, что когда вы используете

echo $dom->saveXML($node);

в цикле, он будет выводить для различных тегов, поэтому вывод будет не конечным результатом, а комбинацией других частей документа.

Попробуйте изменить его на

echo $node->nodeName."=>".$dom->saveXML($node).PHP_EOL;

, чтобы посмотреть, что он делает.

Вы можете просто удалить текущий echo и добавить

echo $dom->saveXML();

после окончания цикла.

В качестве альтернативы, если вы просто хотите обработать теги <img>, вы можете ограничить цикл более конкретно ...

$content = $dom->getElementsByTagName('img');
foreach ($content as $i => $node)
{
    $img_src = $node->getAttribute('src');
    $path_arr = explode('/', $img_src);
    $filename = $path_arr[count($path_arr)-1]; // myface.jpg

    $alt = 'blah';
    $node->setAttribute('alt', $alt);
}
echo $dom->saveXML();
1 голос
/ 24 сентября 2019

Слегка измененный код ниже работает.Он получает только теги img и сохраняет HTML вне цикла.Обратите внимание, что я изменил способ загрузки HTML, чтобы не включать теги-оболочки.

<?php

$str = '<p>hello</p><p>this is patrick</p><p><img src="/assets/img/myface.jpg" width="320" height="320"/></p>';
$new_html = '';
$dom = new DOMDocument();
$dom->loadHTML($str, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$content = $dom->getElementsByTagName('img');
foreach ($content as $i => $node)
{

  $img_src = $node->getAttribute('src');
  $path_arr = explode('/', $img_src);
  $filename = $path_arr[count($path_arr)-1]; // myface.jpg

  $alt = 'blah';
  $node->setAttribute('alt', $alt);
}

echo $dom->saveHTML();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...