Я пытаюсь очистить некоторые страницы своего блога и изменить теги изображений с помощью preg_replace. Когда изображение очищено, я добавляю атрибут данных data-updated, чтобы не изменять их во второй раз.
$final = preg_replace('/<img(.*?)>/', '<img$1 data-updated=\'1\'>', $final);
Но при следующем запуске очистки атрибут data-updated добавляется второй раз. Я мог бы сделать str_replace, чтобы удалить дополнительные обновленные данные, но в первую очередь я хотел бы избежать их добавления через регулярное выражение.
я безуспешно пытался использовать [^data-updated] и нашел похожий пост здесь: Выражение preg_replace не может включать строку но замена data-fancy на data-updated не работает
Есть ли способ добавить только обновленные данные, если их еще нет? В теге есть много других тегов, поэтому мне нужно иметь возможность проверить наличие обновленных данных в любом месте тега img.
Вот пример такого изображения:
<img srcset = "xxx" src = "yyy" loading = "lazy" data-style = "aspect-ratio:4/3;" data-placeholder = "4-3" data-updated = "y" alt = "" width = "100%">
Спасибо! Лоран






Известно, что вложенные структуры, такие как HTML, трудно анализировать с помощью регулярных выражений, потому что эти структуры имеют тип нерегулярный. Не говоря уже о том, что вам явно нужен парсер, поскольку вам нужно проверить наличие атрибутов перед внесением изменений.
Для этого есть ДОМ. Например:
$html = <<<_E_
<html>
<head>
<title>Hello world</title>
</head>
<body>
<div>
<h1>Hello World!</h1>
<img src = "/images/foo.jpg">
</div>
<div>
<img someattr = "yes" src = "/images/bar.jpg">
</div>
</body>
</html>
_E_;
$d = new DomDocument();
$d->loadHtml($html, LIBXML_HTML_NODEFDTD);
foreach($d->getElementsByTagName('img') as $node) {
if ( $node->attributes->getNamedItem('someattr') === null ) {
$node->setAttribute('someattr', 'alsoyes');
}
}
echo $d->saveHTML();
Выход:
<html>
<head>
<title>Hello world</title>
</head>
<body>
<div>
<h1>Hello World!</h1>
<img src = "/images/foo.jpg" someattr = "alsoyes">
</div>
<div>
<img someattr = "yes" src = "/images/bar.jpg">
</div>
</body>
</html>
вы правы, это лучший подход, я использовал анализатор DOM для создания чистого изображения, теперь я использую его, чтобы пометить его как чистый и завернуть в div без использования регулярных выражений. Спасибо, что указали!
[^data-updated]отрицает класс символов, здесь конкретно не соответствующийadeptu-. Вы не можете использовать этот синтаксис для отрицания строк. Если вы хотите использовать регулярное выражение, вместо этого вы хотите использовать негативный взгляд вперед.