OVH Cloud OVH Cloud

verfiier et supprimer une Regexp

3 réponses
Avatar
julien
Bonjour
Je souhaite récupérer les informations sur les liens contenus dans une
page html. Pour cela, j'utilise:
while ($content =~ /<a href=\"(.*?)\"\s(title="(.*?)")?>(.*?)<\/a>/mgi)
{
print "$1 -> $3 -> $4";
print "\n";
}

Je voudrais modifier cette ligne pour que je puisse récupérer les infos
par $1, $3 et $4 ET que cela supprime le texte cherché. En clair, je
veux récupérer les liens puis les supprimer de ma variable $content
J'ai donc essayé:
while ($content =~ s/<a href=\"(.*?)\"\s(title="(.*?)")?>(.*?)<\/a>//mgi)
Mais avec cette ligne, je ne peux afficher que les informations sur le
dernier lien. Je débute avec les expressions régulières. J'ai regardé la
partie de la donc correspondante, mais je ne vois pas ce qui correspond
à ce que je veux faire.

Julien

3 réponses

Avatar
laurent sommier
"julien" a écrit dans le message de news:
3f58e297$0$28878$
Bonjour
Je souhaite récupérer les informations sur les liens contenus dans une
page html. Pour cela, j'utilise:
while ($content =~ /<a href="(.*?)"s(title="(.*?)")?>(.*?)</a>/mgi)
{
print "$1 -> $3 -> $4";
print "n";
}

Je voudrais modifier cette ligne pour que je puisse récupérer les infos
par $1, $3 et $4 ET que cela supprime le texte cherché. En clair, je
veux récupérer les liens puis les supprimer de ma variable $content
J'ai donc essayé:
while ($content =~ s/<a href="(.*?)"s(title="(.*?)")?>(.*?)</a>//mgi)
Mais avec cette ligne, je ne peux afficher que les informations sur le
dernier lien. Je débute avec les expressions régulières. J'ai regardé la
partie de la donc correspondante, mais je ne vois pas ce qui correspond
à ce que je veux faire.


c'est normal, le while n'est parcouru qu'une fois car tu fais une
substitution globale (flag g, en une fois),
essaye d'enlever le flag g, ça devrait fonctionner, ... comme suit

while ($content =~
s!<s*as+hrefs*=s*"(.*?)"s+(titles*=s*"(.*?)")?[^>]*>(.*?)</a>!!mi
) {
print "$1 -> $3 -> $4";
print "n";
}

Avatar
Alex Marandon
In article <3f58e297$0$28878$, julien wrote:
Bonjour
Je souhaite récupérer les informations sur les liens contenus dans une
page html. Pour cela, j'utilise:
while ($content =~ /<a href="(.*?)"s(title="(.*?)")?>(.*?)</a>/mgi)
{
print "$1 -> $3 -> $4";
print "n";
}


Tu considère que l'attribut title est optionnel, mais pas l'espace qui
le précède, tu impose donc qu'il y ait un espace après la valeur de
l'attribut href, meme si il n'y a pas d'attribut title. Or ce n'est pas
souvent le cas. En mettant un ? après le s, j'obtiens plein de résultat
en apliquant ta regex sur une page web. Je suis parti du principe que
$content contenait tout le texte HTML de la page. D'autre part, les
quotes n'ont pas besoin d'être échapées.

Avatar
Manganneau Emmanuel
le Fri, 05 Sep 2003 12:17:45 +0000, julien a ecrit:

Bonjour


Bonjour,

Je souhaite récupérer les informations sur les liens contenus dans une

page html. Pour cela, j'utilise:


<snip>

Je débute avec les expressions régulières. J'ai regardé la partie de
la donc correspondante, mais je ne vois pas ce qui correspond à ce que
je veux faire.

Julien


Je ne te conseille pas de parser une page html avec des regexp, tu n'y
arriveras pas.
Je te conseille plutot :

#!/usr/bin/perl -w

use HTML::Parser;
use strict;
$a = sub {
my $r=shift;
my @href= grep /href/,keys(%$r);
print $r->{$_},"n" for @href;
} ;

my $p=HTML::Parser->new();
$p->handler(start=>$a,"attr");
$p->parse_file("/var/www/index.html");

C'est la seule manière propre de retrouver des liens comme :
<A
HREF="http://www.debian.org/Bugs/">Debian Bug Tracking System</A>.

HTH,

--
| Manganneau Emmanuel | GestraNet SARL |
| | tel : 06 64 09 73 07 |
`--------------------------------------------------------'