Как правильно применить отрицание в регулярных выражениях? Добрый день! Подскажите, как правильно настроить регулярное выражение? Есть строка:$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
Для выполнения обратной задачи - удалить все ссылки, в которых не содержится "match", можно воспользоваться негативным просмотром вперед (negative lookahead). В вашем случае, регулярное выражение будет выглядеть так:
Это выражение будет искать тег <a>, за которым не следует никаких других символов, кроме как не содержащих "match".
Что касается проблемы с модификаторами "", "+", то проблема возникает из-за жадности квантификаторов. Вместо использования или +, попробуйте использовать не-жадный квантификатор *?:
Для выполнения обратной задачи - удалить все ссылки, в которых не содержится "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 );
Надеюсь, это поможет вам решить проблемы с вашими регулярными выражениями.