Вопрос по php, regex, hyperlink, anchor – регулярные выражения, соответствующие ссылкам без тега <a>

5
(http([s]?):\/\/?)(([a-zA-Z0-9]+(\.?))+)([a-zA-Z0-9]+((\.[a-zA-Z]{2,5}){1,2})((\/[a-zA-Z0-9\?&=_\-\~:/?#[\]@!\
(http([s]?):\/\/?)(([a-zA-Z0-9]+(\.?))+)([a-zA-Z0-9]+((\.[a-zA-Z]{2,5}){1,2})((\/[a-zA-Z0-9\?&=_\-\~:/?#[\]@!\$&'()\*\+,;]*)*)((\.[a-zA-Z]{2,5}){0,2}))
amp;'()\*\+,;]*)*)((\.[a-zA-Z]{2,5}){0,2}))

Это мое регулярное выражение, которое хорошо работает для сопоставления ссылок в строке. Но я не хочу выбирать каждую ссылку. Если ссылка имеет"> перед этим или</a> после этого эта ссылка не должна быть найдена. Как это можно сделать?

Они должны соответствовать:

adasdas http://www.stackoverflow.com asdasas
adasdasahttp://www.stackoverflow.com/something asdas

Это НЕ должно совпадать:

adasdas<a href="somelink">           http://www.stackoverflow.com     </a>asdasas
adasdasa<a href="somelink">http://www.stackoverflow.com/something</a> asdas

Зачем мне это нужно? Я хочу, чтобы каждая ссылка была кликабельной, даже если она не находится между тегами привязки.

@Wellenbrecher В соответствии с вышеизложенным<a href="http://www.stackoverflow.com">stackoverflow.com</a> не должно совпадать. Вы проверили мое регулярное выражение? hex494D49
@Valerij, что если ссылка выглядит следующим образом: <a href="somelink"> немного текста </a>? Wellenbrecher
как насчет URL вsrc= атрибуты, напримерimg а такжеscript, я действительно думаю, что вам нужно использовать парсер Propper, а затем удалить все<a>с дерева, а затем запустить регулярное выражение надtextContent Valerij
@DarkBee Что делать, если парсер не работает на дерьмовом HTML? :) hex494D49

Ваш Ответ

2   ответа
11

Со всеми заявлениями об отказе от использования регулярных выражений для разбора HTML, если вы хотите использовать регулярные выражения для этой задачи, это будет работать:

$regex="~<a.*?</a>(*SKIP)(*F)|http://\S+~";

Увидетьдемо.

Эта проблема является классическим случаем техники, описанной в этом вопросеmsgstr "сопоставить шаблон, исключая ..."

Левая сторона чередования| совпадения завершены<a ...tags </a> затем намеренно выходит из строя, после чего двигатель переходит к следующей позиции в строке. Правая сторона соответствует URL-адресам, и мы знаем, что они правильные, потому что они не совпадали с выражением слева.

Регулярное выражение URL, которое я поставил справа, может быть уточнено, просто используйте то, что соответствует вашим потребностям.

Ссылка

Как сопоставить (или заменить) шаблон кроме случаев s1, s2, s3 ...Статья о соответствии шаблону, если ...
@ zx81 что значит (* SKIP) (* F) здесь? Hast
15 минут назад моей репутации не хватило, чтобы проголосовать. Но сейчас 19, и я проголосовал. Еще раз спасибо. Wellenbrecher
Спасибо, это здорово! Thomas Leduc
Добавил свой собственный шаблон в конец вашего (<a.*?</a>(*SKIP)(*F)|), и это сработало! Благодарю. Wellenbrecher
Спасибо! Увидимся в следующий раз. :) zx81
0

Похожие вопросы