PHP - preg_replace: не заменять, если атрибут данных найден в изображении

Я пытаюсь очистить некоторые страницы своего блога и изменить теги изображений с помощью 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%">

Спасибо! Лоран

[^data-updated] отрицает класс символов, здесь конкретно не соответствующий adeptu-. Вы не можете использовать этот синтаксис для отрицания строк. Если вы хотите использовать регулярное выражение, вместо этого вы хотите использовать негативный взгляд вперед.
Markus AO 04.04.2022 21:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
21
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Известно, что вложенные структуры, такие как 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 без использования регулярных выражений. Спасибо, что указали!

Laurent 05.04.2022 15:00

Другие вопросы по теме