Eu sou novo para Perl e tenho algumas perguntas regex
-
05-07-2019 - |
Pergunta
Eu estou ensinando-me Perl e eu aprendem melhor pelo exemplo. Como tal, eu estou estudando um simples script Perl que raspa um blog específico e encontrei-me confuso sobre um par das demonstrações regex. Os olhares de script para os seguintes pedaços de html:
<dt><a name="2004-10-25"><strong>October 25th</strong></a></dt>
<dd>
<p>
[Content]
</p>
</dd>
... and so on.
e aqui está o script exemplo que eu estou estudando:
#!/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));
}
}
Se você tiver um momento para melhor me ajudar a entender, minhas perguntas são:
-
Como o trabalho seguinte linha:
([^ "] *) # nome Anchor
-
Como o trabalho seguinte linha:
([^>] *) # Publicar título
-
O que faz o "seis" média na seguinte linha:
/ seis)
Muito obrigado antecipadamente por toda a sua ajuda! Eu também estou pesquisando as respostas às minhas próprias perguntas no momento, mas estava esperando que alguém poderia me dar um impulso!
Solução
Como a seguinte linha de trabalho ...
([^ "] *) # nome Anchor
zero ou mais coisas que não são", capturado como US $ 1, US $ 2, ou qualquer outra coisa, dependendo do número de suportes (em que somos.
Como a seguinte linha de trabalho ...
([^>] *) # Publicar título
zero ou mais coisas que não são>, capturados como US $ 1, US $ 2, ou o que quer.
O que faz o "seis" média no seguinte linha ...
/ seis)
- s = jogo como uma única linha (Isto apenas significa que "" corresponde a tudo, incluindo \ n, o que não faria de outra forma)
- i = CASE jogo insensível
- x = ignorar espaços em branco em regex.
x
também torna possível para colocar comentários no próprio regex, então as coisas como # Post title
há apenas comentários.
perldoc perlre para mais melhor informação /. O link é para Perl 5.10. Se você não tem Perl 5.10 você deve olhar para o documento perlre para sua versão do Perl em seu lugar.
Outras dicas
- meios
[^"]*
"qualquer seqüência de zero ou mais caracteres que não contém aspas". Esta é cercado por aspas fazendo formando uma cadeia entre aspas, do tipo que segue<a name=
-
[^>]*
é semelhante ao anterior, isso significa qualquer string que não contém>
. Note aqui que você provavelmente média[^<]
, para corresponder até o<
abertura para a próxima tag, não incluindo a abertura real. - que é uma coleção de bandeiras regexp php específicos. Sei meios
i
maiúsculas e minúsculas, não tenho certeza sobre o resto.
-
O código é uma expressão regular estendida. Ele permite que você coloque espaços em branco e comentários em suas expressões regulares. Veja perldoc perlre e perlretut . Caso contrário, como normal.
-
Mesmo.
- Os personagens são regex modificadores .