Нечетное поведение Perl Regex с паренами - PullRequest
1 голос
/ 26 мая 2011

Я вытаскиваю некоторую разметку Википедии и хочу сопоставить URL-адреса в относительных (в Википедии) ссылках. Я не хочу сопоставлять URL-адреса, содержащие двоеточие (не считая двоеточия протокола), чтобы избежать специальных страниц и тому подобного, поэтому у меня есть следующий код:

while ($body =~ m|<a href="(?<url>/wiki/[^:"]+)|gis) { 
  my $url = $+{url};
  print "$url\n";
}

к сожалению, этот код работает не совсем так, как ожидалось. Любой URL, содержащий круглые скобки [т.е. /wiki/Eon_(geology)] преждевременно обрезается перед открытием, поэтому URL будет соответствовать /wiki/Eon_. Я немного искал код и не могу понять, что я делаю не так. Кто-нибудь может дать некоторое представление?

Ответы [ 2 ]

1 голос
/ 26 мая 2011

В этом коде нет ничего плохого в том виде, в каком он есть, пока ваш Perl достаточно новый, чтобы поддерживать эти функции RE.Протестировано с Perl 5.10.1.

$body = <<"__ENDHTML__";
<a href="/wiki/Eon_(geology)">Body</a> Blah blah 
<a href="/wiki/Some_other_(parenthesis)">Body</a>
__ENDHTML__

while ($body =~ m|<a href="(?<url>/wiki/[^:"]+)|gis) { 
  my $url = $+{url};
  print "$url\n";
}

Вы используете старый Perl?

0 голосов
/ 26 мая 2011

Вы не привязали RE к концу строки.Поставьте «потом».

Хотя это и проблема, которую он пытался решить, это не проблема. Проблема, которую он пытался решить, заключалась в том, что не было ничего, что соответствовало бы методу / имени хоста (http://en.wiki. ..) в RE. Добавление. *? поможет, до "(?"

...