У меня есть переменная, которая содержит всю статью, включая текст и некоторые ссылки.
Мне нужно перебрать содержимое в переменной и найти все экземпляры ссылок, содержащих определенное слово. После того, как они были найдены, мне нужно удалить все после последнего / в каждом из найденных URL.
Например:
Допустим, на странице 8 ссылок — 4 из них содержат слово «статья».
Мне нужно найти каждую из этих ссылок, которые содержат слово «статья», а затем удалить все после последнего появления / в каждой из этих ссылок.
До сих пор я пытался использовать некоторые Regex, такие как:
/<a.*?href\s*=\s*["\']([^"\'>]*article[^"\'>]*)["\'][^>]*>.*?<\/a>/si
Но не нашли способа реально заменить все после последнего /
Любые идеи о том, как это может быть достигнуто?
Использование инструментов 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);
Я сделал живое демо также.
Других решений пока нет …