Soy nuevo en Perl y tengo algunas preguntas sobre expresiones regulares.
-
05-07-2019 - |
Pregunta
Me estoy enseñando a mí mismo Perl y aprendo mejor con el ejemplo. Como tal, estoy estudiando un script de Perl simple que raspa un blog específico y me he confundido sobre un par de declaraciones regex. El script busca los siguientes fragmentos de HTML:
<dt><a name="2004-10-25"><strong>October 25th</strong></a></dt>
<dd>
<p>
[Content]
</p>
</dd>
... and so on.
y aquí está el script de ejemplo que estoy estudiando:
#!/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));
}
}
Si tiene un momento para ayudarme a comprender mejor, mis preguntas son:
-
cómo funciona la siguiente línea:
([^ "] *) # Nombre del ancla
-
cómo funciona la siguiente línea:
([^ >] *) # Título de la publicación
-
¿qué significa el " seis " significa en la siguiente línea:
</dd>/six)
¡Muchas gracias de antemano por toda su ayuda! También estoy investigando las respuestas a mis propias preguntas en este momento, ¡pero esperaba que alguien me diera un impulso!
Solución
cómo funciona la siguiente línea ...
([^ "] *) # Nombre del ancla
cero o más cosas que no son " ;, capturadas como $ 1, $ 2 o lo que sea, dependiendo de la cantidad de paréntesis (en el que estamos.
cómo funciona la siguiente línea ...
([^ >] *) # Título de la publicación
cero o más cosas que no son > ;, capturadas como $ 1, $ 2 o lo que sea.
¿qué significa el " seis " significa en el línea siguiente ...
< / dd > / six)
- s = coincidir como una sola línea (esto solo significa que ". " coincide con todo, incluyendo \ n, lo que de otro modo no haría)
- i = coincide con mayúsculas y minúsculas
- x = ignorar espacios en blanco en expresiones regulares.
x
también hace posible poner comentarios en la expresión regular en sí, por lo que cosas como # Post title
son solo comentarios.
Consulte perldoc perlre para obtener más / mejor información. El enlace es para Perl 5.10. Si no tiene Perl 5.10, debería consultar el documento de Perlre para su versión de Perl.
Otros consejos
-
[^"]*
significa " cualquier cadena de cero o más caracteres que no contiene comillas " ;. Esto está rodeado de comillas que forman una cadena entre comillas, del tipo que sigue a<a name=
-
[^>]*
es similar a lo anterior, significa cualquier cadena que no contenga>
. Tenga en cuenta aquí que probablemente quiera decir[^<]
, para que coincida hasta la apertura<
para la siguiente etiqueta, sin incluir la apertura real. - es una colección de banderas de expresiones regulares específicas de php. Sé que
i
significa mayúsculas y minúsculas, no estoy seguro del resto.
-
El código es una expresión regular extendida. Le permite poner espacios en blanco y comentarios en sus expresiones regulares. Consulte perldoc perlre y perlretut . De lo contrario, como es normal.
Same.
- Los caracteres son modificadores de expresiones regulares .