regex — перебирает все ссылки, удаляет контент после последнего появления

У меня есть переменная, которая содержит всю статью, включая текст и некоторые ссылки.

Мне нужно перебрать содержимое в переменной и найти все экземпляры ссылок, содержащих определенное слово. После того, как они были найдены, мне нужно удалить все после последнего / в каждом из найденных URL.

Например:
Допустим, на странице 8 ссылок — 4 из них содержат слово «статья».
Мне нужно найти каждую из этих ссылок, которые содержат слово «статья», а затем удалить все после последнего появления / в каждой из этих ссылок.

До сих пор я пытался использовать некоторые Regex, такие как:

    /<a.*?href\s*=\s*["\']([^"\'>]*article[^"\'>]*)["\'][^>]*>.*?<\/a>/si

Но не нашли способа реально заменить все после последнего /

Любые идеи о том, как это может быть достигнуто?

0

Решение

Использование инструментов DOM означает, что вы гораздо больше заботитесь о своем процессоре. Я не говорю, что RegEx, предназначенный для полного использования для обработки текста, не является подходящим инструментом для предложения решения, но конкретный инструмент для конкретной работы всегда почти чище и работает лучше.

По тому, что вы уже сказали, я изменил ваше регулярное выражение следующим образом:

(<a(?>.+?)href\s*=\s*(["'])(?>[^"'><]*?article)(?>[^>]*?/))(.*?)(\2.*?>[^<]++</a>)

и вам нужно только заменить полное совпадение с 1-й и 4-й захваченными группами. Таким образом, код будет:

echo preg_replace('~(<a(?>.+?)href\s*=\s*(["\'])(?>[^"\'><]*?article)(?>[^>]*?/))(.*?)(\2.*?>[^<]++</a>)~s', '\1\4', $html);

Я сделал живое демо также.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]