Как правильно применить отрицание в регулярных выражениях? Добрый день!
Подскажите, как правильно настроить регулярное выражение?
Есть строка:$str= '
текст 1
Ссылка1
текст 2
Ссылка2
текст 3
Ссылка3
текст 4';Правильно работают выборки:
Удалить все ссылки, в которых содержится class:echo preg_replace( '~]class[^>]*>~siu', "", $str );
Удалить все ссылки, в которых не содержится class:echo preg_replace( '~](?!class)[^>]*>~siu', "", $str );Отодвигаюсь внутрь тега.
Успешно удаляются все ссылки, которые ссылаются на сайт, в названии которого встречается match:echo preg_replace( '~]*?match[^>]+>[^<]+~siu', "", $str );
А вот обратная задача: удалить все ссылки, в которых не содержится match, у меня не получается (чистятся все теги).
Аналогично: рабочая выборка из первого примера перестаёт работать, как только добавляю модификатор * или +
]class[^>]*>
]+class[^>]*>
Подскажите, как правильно сделать?https://regex101.com/r/suCdNB/2

21 Авг 2019 в 06:28
210 +1
1
Ответы
1

Для выполнения обратной задачи - удалить все ссылки, в которых не содержится "match", можно воспользоваться негативным просмотром вперед (negative lookahead). В вашем случае, регулярное выражение будет выглядеть так:

echo preg_replace( '~<(a)(?![^>]*match)[^>]*>~siu', "", $str );

Это выражение будет искать тег <a>, за которым не следует никаких других символов, кроме как не содержащих "match".

Что касается проблемы с модификаторами "", "+", то проблема возникает из-за жадности квантификаторов. Вместо использования или +, попробуйте использовать не-жадный квантификатор *?:

echo preg_replace( '~<(a)[^>]class[^>]*?>~siu', "", $str );
echo preg_replace( '~<(a)[^>]+class[^>]*?>~siu', "", $str );

Также можно воспользоваться жадным квантификатором и использовать отрицательный просмотр вперед:

echo preg_replace( '~<(a)(?![^>]class)[^>]*>~siu', "", $str );
echo preg_replace( '~<(a)(?![^>]+class)[^>]*>~siu', "", $str );

Надеюсь, это поможет вам решить проблемы с вашими регулярными выражениями.

20 Апр 2024 в 13:17
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир