Как извлечь значение HREF из ссылки HTML? - PullRequest
3 голосов
/ 29 мая 2009

Мой текстовый файл содержит 2 строки:

[DIR] yahoo.com.jp/

В моем скрипте Perl у меня есть:

my $String =~ /.*(HREF=")(.*)(">)/;
print "$2";

и мой вывод следующий:

Output 1: yahoo.com.jp

Output 2: ><HR>

Я пытаюсь добиться, чтобы мой Perl-скрипт автоматически извлекал строку внутри <A Href="">

Поскольку я очень плохо знаком с регулярным выражением, я хочу спросить, является ли мое регулярное выражение плохо сформированным? Если да, то может ли кто-нибудь предложить какое-нибудь предложение, чтобы он выглядел лучше?

Во-вторых, я не знаю, почему мой второй вывод "><HR>", я думал, что ожидаемое поведение - выход2 будет пропущен, поскольку он не содержит HREF = ". Очевидно, я очень неправ.

Спасибо за помощь.

Ответы [ 4 ]

8 голосов
/ 29 мая 2009

Чтобы ответить на ваш конкретный вопрос о том, почему ваше регулярное выражение не работает, вы используете .*, который является «жадным» - по умолчанию он будет соответствовать столько, сколько вы можете. Альтернативы будут использовать не жадную форму, .*?, или быть немного более точным о том, что вы пытаетесь сопоставить. Например, [^"]* будет соответствовать всему, что не является двойной кавычкой, что, кажется, то, что вы ищете.

Но да, другие постеры верны - использование регулярных выражений для выполнения чего-либо нетривиального при разборе HTML - это путь к катастрофе. Технически вы можете сделать это правильно, особенно в Perl 5.10 (который имеет более продвинутые функции регулярных выражений), но обычно это не стоит головной боли.

8 голосов
/ 29 мая 2009

Использование регулярных выражений для разбора HTML работает достаточно часто, чтобы ввести вас в заблуждение о безопасности. Вы можете избежать неприятностей в простых случаях, когда вы управляете вводом, но лучше использовать что-то вроде HTML :: Parser .

0 голосов
/ 30 мая 2009

Если можно, я хотел бы предложить самый простой способ сделать это (это может быть не самый быстрый или легкий способ): HTML :: TreeBuilder :: XPath

Это дает вам силу XPath в неправильно сформированном HTML.

use HTML::TreeBuilder::XPath;

my $tree= HTML::TreeBuilder::XPath->new_from_file( 'D:\Archive\XPath.pm.htm' );
my @hrefs = $tree->findvalues( '//div[@class="noprint"]/a/@href');
print "The links are: ", join( ',', @hrefs ), "\n";
0 голосов
/ 29 мая 2009

При попытке сопоставления с HTML (или XML) с помощью регулярного выражения вы должны быть осторожны с использованием . Редко когда-либо вы хотите. , потому что начало - это жадный модификатор, который будет соответствовать, насколько это возможно. как показал Гамбо, используйте спецификатор класса символов [^ "] *, чтобы соответствовать всем символам, кроме кавычки. Это будет соответствовать до конца кавычки. Вы также можете использовать что-то подобное для соответствия угловой скобке. Попробуйте это:

/HREF="([^"]*)"[^>]*>/i

Это должно соответствовать гораздо более последовательно.

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