Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 01/07/2008, à 14:19

mansonboy

[php] problem regex

bonjour, depuis quelques jour j'essaye de faire quelques chose mais il y a un problem. Je dois faire une regex sur une page internet, donc je dois selectioner tout ce qui est entre ces balises :

<hr width="90%" /> et <table width=70% border='1px solid' align='center'>

Ma regex commence bien a recuperer seulement apres le <hr width="90%" /> mais elle continu également apres <table width=70% border='1px solid' align='center'>.

Voila ma regex :

$var = preg_replace('#(.*)<hr width="90%" \/>(.*)<table width=70% border=\'1px solid\' align=\'center\'>#is', '$2', $page);

Merci d'avance de votre aide parce que je pete un cable la.

Hors ligne

#2 Le 01/07/2008, à 14:38

aeacides

Re : [php] problem regex

Je n'ai pas trop le temps de chercher, mais un conseil que je pourrais te donner pour débugger serait d'essayer de trouver seulement cette chaîne:

<table width=70% border=\'1px solid\' align=\'center\'>

Si ton expression retrouve cette chaîne, tu peux alors ajouter le reste. Car peut-être ton problème vient de là. Si en ajoutant le reste ça bug, et bien il y a un problème là:

(.*)

ou là

#is

Tu pourrais regarder là aussi pour plus d'info: http://ca.php.net/manual/fr/function.preg-replace.php
http://www.manuelphp.com/php/function.preg-replace.php
@+

Dernière modification par aeacides (Le 01/07/2008, à 14:41)


http://www.q-be.ca

Hors ligne

#3 Le 01/07/2008, à 15:03

mansonboy

Re : [php] problem regex

Il la retrouve bien.

Dernière modification par mansonboy (Le 01/07/2008, à 15:04)

Hors ligne

#4 Le 01/07/2008, à 20:56

Yannick_LM

Re : [php] problem regex

bah oui, le .* est "glouton". Il va chercher le plus loin possible.
Par exemple, avec la regexp:
/<(.*)>/ 
et le texte:
<blabla> qmlksjdfmqj <blibli> , ce qui est matché, c'est toute la chaîne.

Une solution possible est de faire:
/<[^>]*>/ , qui ne matchera que <blabla>


voilà wink

(Sinon, en Perl, y a moyen de préciser le degré de "gloutonnerie" des regexpes, mais je sais pas si c'est pareil en php)


Trucs et astuces pour Vim
Ma web page  avec des trucs dessus ...

Hors ligne

#5 Le 01/07/2008, à 21:24

mansonboy

Re : [php] problem regex

Sa me donne ceci :

$var = preg_replace('#<hr width="90%" \/><[^>]*><br><br>#', '$1', $page);

Sa m'affiche tout cette fois ci...

Hors ligne

#6 Le 02/07/2008, à 08:33

Alain.g

Re : [php] problem regex

mansonboy a écrit :

Ma regex commence bien a recuperer seulement apres le <hr width="90%" /> mais elle continu également apres <table width=70% border='1px solid' align='center'>.

Voila ma regex :

$var = preg_replace('#(.*)<hr width="90%" \/>(.*)<table width=70% border=\'1px solid\' align=\'center\'>#is', '$2', $page);

Merci d'avance de votre aide parce que je pete un cable la.

Bonjour

Tu utilises preg_replace, qui sert à faire des substitutions. Là tu demandes de substituer tout jusqu'à la balise '<table…>' (compris) par ce qui est entre '<hr…>' et '<table…>'. Donc ce qui suit <table..> sera conservé, rien d'étonnant.
Pour éviter cela il faudrait remplacer tout jusqu'à la fin par ce qui est en '<hr…>' et '<table…>', en ajoutant '.*' à la fin du motif.
Par ailleurs la première parenthèse capturante est inutile.

Ceci dit il serait plus approprié d'utiliser preg_match :

preg_match('#<hr width="90%" />(.*)<table width=70% border=\'1px solid\' align=\'center\'>#is', $page, $var);

preg_match retourne un tableau, la partie cherchée correspond ici à $var[1]

Dernière modification par Alain.g (Le 02/07/2008, à 08:41)


Xubuntu Karmic !

Hors ligne

#7 Le 02/07/2008, à 18:56

mansonboy

Re : [php] problem regex

Sa marche pas...

Hors ligne

#8 Le 02/07/2008, à 19:02

Alain.g

Re : [php] problem regex

#!/usr/bin/php
<?php
$page="pas bon<hr width=\"90%\" />
bon
<table width=70% border='1px solid' align='center'>
pas bon";

preg_match('#<hr width="90%" />(.*)<table width=70% border=\'1px solid\' align=\'center\'>#is', $page, $var);
echo $var[1];
?>

Renvoie bien "bon", donc ça marche wink

Dernière modification par Alain.g (Le 02/07/2008, à 19:03)


Xubuntu Karmic !

Hors ligne