Можно вернуть захват, используя grep и регулярное выражение Perl - PullRequest
2 голосов
/ 08 декабря 2011

Можно ли вернуть только захваченную часть регулярного выражения, используя функцию grep в Perl? У меня есть такой код:

use LWP::Simple;
my $examples_content = get('http://example.com/javascript/reports/examples/');
my @hrefs = grep(/href="(.*)"/, split("\n", $examples_content));
print $hrefs[0];

Что печатается, хотя:

Автономные диаграммы с одним вопросом

Когда я хотел бы просто: simple_chart.html

Ответы [ 4 ]

6 голосов
/ 08 декабря 2011

Почему вы используете grep? Это может делать то, что вы хотите:

my @hrefs = $examples_content =~ /href="(.*?)"/g
4 голосов
/ 08 декабря 2011

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

    use HTML::SimpleLinkExtor;

    my $extor = HTML::SimpleLinkExtor->new;
    $extor->parse($html);

    @a_hrefs     = $extor->a;    # by tag
    @hrefs       = $extor->href; # by attribute

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

Большинство других людей уже решали проблемы с map и split, но вы также должны быть осторожны с регулярными выражениями:

 my @hrefs = map {
      / \s href \s* = \s* (['"]) (.*?) \1 /ix ? $2 : ()
     } @lines;

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

3 голосов
/ 08 декабря 2011

map может легко эмулировать grep, возвращая или не возвращая значение:

my @hrefs = map(/href="(.*?)"/g, split("\n", $examples_content));

, но я согласен с Amadan и BRPocock , которыеудаление разделения и просто сопоставление с источником в этом случае будет работать лучше, но я добавил это как ответ, чтобы показать вам, как map может использоваться для других случаев.

в духе более чем одногоспособ сделать это, строка:

my @hrefs = $examples_content =~ /href="(.*?)"/g;

также может быть написано:

my @hrefs = map /href="(.*?)"/g, $examples_content;

, если вы предпочитаете порядок [выходной преобразование ввода] , а не [выходное входное преобразование]

3 голосов
/ 08 декабря 2011

grep может быть неправильным инструментом для работы.Попробуйте просто $examples_content =~ /href="(.*?)"/g… сначала не нужно split, и модификатор ? не позволит шаблону href=".*" слишком сильно совпадать.

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