Регулярное выражение для поиска URL не внутри гиперссылки - PullRequest
3 голосов
/ 22 августа 2009

Существует множество регулярных выражений, соответствующих URL. Однако я пытаюсь сопоставить URL-адреса, которые нигде не отображаются в теге гиперссылки <a> (HREF, внутреннее значение и т. Д.). Так что ни один из URL-адресов в них не должен совпадать:

<a href="http://www.example.com/">something</a>
<a href="http://www.example.com/">http://www.example2.com</a>
<a href="http://www.example.com/"><b>something</b>http://www.example.com/<span>test</span></a>

Любой URL за пределами <a></a> должен совпадать.

Один из подходов, которые я попробовал, состоял в том, чтобы использовать отрицательный прогноз, чтобы увидеть, был ли первый тег <a> после URL открывающим <a> или закрывающим </a>. Если это закрывающий </a>, то URL должен быть внутри гиперссылки. Я думаю, что эта идея была в порядке, но регулярное выражение отрицательного вида не сработало (или, точнее, регулярное выражение было написано неправильно). Любые советы очень ценятся.

Ответы [ 4 ]

2 голосов
/ 22 августа 2009

Вы можете сделать это в два этапа, вместо того, чтобы пытаться придумать одно регулярное выражение:

  1. Смешать (заменить ничем) часть привязки HTML (весь тег привязки: открывающий тег, содержимое и закрывающий тег).

  2. Соответствует URL

В Perl это может быть:

my $curLine = $_; #Do not change $_ if it is needed for something else.
$curLine =~ /<a[^<]+<\/a>//g; #Remove all of HTML anchor tag, "<a", "</a>" and everything in between.
if ( $curLine =~ /http:\/\//)
{
  print "Matched an URL outside a HTML anchor !: $_\n";
}
0 голосов
/ 22 августа 2009

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

0 голосов
/ 22 августа 2009

У Питера отличный ответ: сначала удалите якоря, чтобы

Some text <a href="http://page.net">TeXt</a> and some more text with link http://a.net

заменяется на

Some text  and some more text with link http://a.net

Затем запустите регулярное выражение, которое находит URL:

http://a.net
0 голосов
/ 22 августа 2009

Это можно сделать с помощью одного регулярного выражения, которое соответствует тегам привязки и гиперссылкам:

# Note that this is a dummy, you'll need a more sophisticated URL regex
regex = '(<a[^>]+>)|(http://.*)'

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...