У меня есть строка с некоторым <img>
.
$string = ' <img src="pic.jpg"> and <img src="pic2.jpg">';
$doc = new DOMDocument('1.0', 'UTF-8');
libxml_use_internal_errors(true);
$doc->loadHTML(mb_convert_encoding($string, 'HTML-ENTITIES', 'UTF-8'));
libxml_clear_errors();
$imgs = $doc->getElementsByTagName('img');
foreach ($imgs as $img)
{
if($img->getAttribute('src') == 'pic.jpg')
{
// I want delete that picture form string
$img->parentNode->removeChild($img);
}
else
$img->setAttribute('class', 'image normall');
}
$string = $doc->saveHTML();
echo $string;
В конце функции, когда я печатаю $string
, целевой pic был удалён, но для другого pic не добавляется никакого класса!
но если я удалю $img->parentNode->removeChild($img);
, класс добавит! что я не так?
EDIT, пожалуйста, проверьте эту строку:
$string = ' <img src="pic.jpg"> and <img src="pic2.jpg">';
Вы можете удалять узлы, если вы повторяете назад.
Просто измените
// Forward iteration
foreach ($imgs as $img) {
в
// Reverse iteration
for($i = $imgs->length; --$i >= 0;) {
$img = $imgs->item($i);
Ссылка: http://php.net/manual/en/class.domnodelist.php#83390
Окончательно я решил это с этим изменением.... надеюсь, помогите другим...
$string = ' <img src="pic.jpg"> and <img src="pic2.jpg">';
$doc = new DOMDocument('1.0', 'UTF-8');
libxml_use_internal_errors(true);
$doc->loadHTML(mb_convert_encoding($string, 'HTML-ENTITIES', 'UTF-8'));
libxml_clear_errors();
$imgs = $doc->getElementsByTagName('img');
$imgs1 = $imgs2 = array();
foreach($imgs as $img) {
if($img->getAttribute('src') == 'pic.jpg')
{
$imgs1[] = $img;
}
else
$imgs2[] = $img;
}
foreach($imgs1 as $img) {
$img->parentNode->removeChild($img);
}
foreach ($imgs2 as $img)
{
$img->setAttribute('class', 'image normall');
}
$string = $doc->saveHTML();
echo $string;
if($img->getAttribute('src') == 'pic.jpg')
.... код удаляет этот рисунок ... Но неif($img->getAttribute('src') == 'pic.jpg')
добавить класс для другого изображения