Я новичок в Perl, и у меня есть несколько вопросов по регулярным выражениям
-
05-07-2019 - |
Вопрос
Я сам изучаю Perl и лучше всего учусь на собственном примере.Таким образом, я изучаю простой Perl-скрипт, который очищает конкретный блог, и обнаружил, что запутался в паре операторов регулярных выражений.Скрипт ищет следующие фрагменты html:
<dt><a name="2004-10-25"><strong>October 25th</strong></a></dt>
<dd>
<p>
[Content]
</p>
</dd>
... and so on.
и вот пример сценария, который я изучаю:
#!/usr/bin/perl -w
use strict;
use XML::RSS;
use LWP::Simple;
use HTML::Entities;
my $rss = new XML::RSS (version => '1.0');
my $url = "http://www.linux.org.uk/~telsa/Diary/diary.html";
my $page = get($url);
$rss->channel(title => "The more accurate diary. Really.",
link => $url,
description => "Telsa's diary of life with a hacker:"
. " the current ramblings");
foreach (split ('<dt>', $page))
{
if (/<a\sname="
([^"]*) # Anchor name
">
<strong>
([^>]*) # Post title
<\/strong><\/a><\/dt>\s*<dd>
(.*) # Body of post
<\/dd>/six)
{
$rss->add_item(title => $2,
link => "$url#$1",
description => encode_entities($3));
}
}
Если у вас найдется минутка, чтобы лучше помочь мне понять, мои вопросы таковы:
как работает следующая строка:
([^"]*) # Имя якоря
как работает следующая строка:
([^>]*) # Заголовок сообщения
что означает "шестерка" в следующей строке:
</dd>/шесть)
Заранее большое спасибо за вашу помощь!В данный момент я также ищу ответы на свои собственные вопросы, но надеялся, что кто-нибудь сможет меня подтолкнуть!
Решение
как работает следующая строка...
([^"]*) # Имя якоря
ноль или более вещей, которые не являются ", записанными как $1, $2 или что-то еще, в зависимости от количества скобок ( в we are.
как работает следующая строка...
([^>]*) # Заголовок сообщения
ноль или более вещей, которые не >, записанные как $1, $2 или что-то еще.
Что означает «шесть» в следующей строке ...
</dd>/шесть)
- s = совпадение в одну строку (это просто означает, что "." соответствует всему, включая , чего в противном случае не было бы)
- i = совпадение без учета регистра
- x = игнорировать пробелы в регулярном выражении.
x
также позволяет добавлять комментарии в само регулярное выражение, поэтому такие вещи, как # Post title
есть только комментарии.
Видеть перлдок для получения дополнительной/лучшей информации.Ссылка предназначена для Perl 5.10.Если у вас нет Perl 5.10, вам следует вместо этого просмотреть документ perlre для вашей версии Perl.
Другие советы
[^"]*
означает "любая строка из нуля или более символов, которая не содержит кавычек".Это окружено кавычками, образующими строку в кавычках следующего вида<a name=
[^>]*
аналогично приведенному выше, это означает любую строку, которая не содержит>
.Обратите внимание, что вы, вероятно, имеете в виду[^<]
, соответствовать до открытия<
для следующего тега, не включая фактическое открытие.- это набор специфичных для php флагов регулярных выражений.Я знаю
i
означает, что регистр не чувствителен, не уверен насчет остального.
Код представляет собой расширенное регулярное выражение.Это позволяет вам добавлять пробелы и комментарии в ваши регулярные выражения.См. перлдок перлр и Перлретут.В остальном вроде нормально.
Такой же.
- Персонажи модификаторы регулярных выражений.