OVH Cloud OVH Cloud

probleme avec preg_match_all

3 réponses
Avatar
Leonick
Bonjour,
J'ai un problème avec la fonction preg_match_all.
Le script en dessous fonctionne correctement, mais si je modifie la ligne
$de_quoi de cette manière
$de_quoi="<H3>Un
essai</H3>";
(càd en faisant passer le texte à la ligne avec "Un") preg_match_all ne me
renvoi plus rien. Est-ce normal ?
En fait le but c'est de parser un document dans lequel des retours à la ligne
peuvent être fait dans mon masque de recherche (autre que H3)


<HTML>
<BODY>
<?PHP
$de_quoi="<H3>Un essai</H3>";
echo "$de_quoi</h1>\nRésultat : <p>\n";
$combien=preg_match_all('/<H3.*>(.*?)<\/H3>/',$de_quoi,$match,PREG_SET_ORDER);
//$combien=preg_match_all('/<H3.*>(.*?)<\/H3>/',$de_quoi,$match,PREG_PATTERN_ORD
ER);
foreach($match as $line){
echo "\n".$line[0];
}
?>
</BODY>
</HTML>

Merci

Leonick
http://gege-en-vadrouille.champignytriathlon.org la route de la soie en 11 000
km de vélo

3 réponses

Avatar
Antoine Dinimant
(càd en faisant passer le texte à la ligne avec "Un") preg_match_all ne me
renvoi plus rien. Est-ce normal ?


oui. en allant à la ligne, tu introduis un "n" dans $de_quoi. Or, par
défaut les regex travaillent ligne par ligne, ce qui implique que le
point ne reconnaît pas le "n". Pour que cela marche, il faut que tu te
mettes en mode "single line" avec le modificateur /s :

/<H3.*>(.*?)</H3>/s

par ailleurs, si tu essaies ta ragex sur un texte du genre :

$de_quoi = "<H3>Un essai</H3>blablabla<H3>Second essai</H3>blobloblo" ;

tu vas comprendre pourquoi on dit que l'étoile est gourmande (greedy)...

une solution serait par ex. :

/<H3.*?>(.*?)</H3>/s

ou encore, en supposant qu'il n'y a pas de > dans les attributs de ton H3 :
/<H3[^>]*>(.*?)</H3>/s

enfin, tu as tout intérêt à prévoir qu'on écrive h3 en minuscules, donc
à ajouter le /i

voilà !

Antoun

Avatar
Leonick
"Antoine Dinimant" a écrit dans le message de
news:
(càd en faisant passer le texte à la ligne avec "Un") preg_match_all ne me
renvoi plus rien. Est-ce normal ?


oui. en allant à la ligne, tu introduis un "n" dans $de_quoi. Or, par
défaut les regex travaillent ligne par ligne, ce qui implique que le
point ne reconnaît pas le "n". Pour que cela marche, il faut que tu te
mettes en mode "single line" avec le modificateur /s :

/<H3.*>(.*?)</H3>/s

Merci, ça marche impec'


par ailleurs, si tu essaies ta ragex sur un texte du genre :

$de_quoi = "<H3>Un essai</H3>blablabla<H3>Second essai</H3>blobloblo" ;

tu vas comprendre pourquoi on dit que l'étoile est gourmande (greedy)...

une solution serait par ex. :

/<H3.*?>(.*?)</H3>/s

ou encore, en supposant qu'il n'y a pas de > dans les attributs de ton H3 :
/<H3[^>]*>(.*?)</H3>/s
Ca veut dire quoi [^>] ?

En fait, ce que je veux faire, c'est de parser le fichier bookmark créé par
Firefox et donc je voulais récupérer tout ce qu'il y avait entre <DL> et </DL>
et cela ne tenait pas sur une seule ligne.
Une fois que j'avais obtenu le contenu de ma variable, je la repassais dans la
même fonction pour voir s'il y avait d'autres <DL></DL> et sinon, j'utilisais la
fonction pour voir ce qu'il y avait dans les <H3></H3>
et donc, pour le regex du <DL></DL>, il y avait d'autres ">" dans le contenu.

enfin, tu as tout intérêt à prévoir qu'on écrive h3 en minuscules, donc
à ajouter le /i
les H3 sont en majuscules. A quoi sert le /i ?


Merci
Leonick


Avatar
Antoine Dinimant
par ailleurs, si tu essaies ta ragex sur un texte du genre :

$de_quoi = "<H3>Un essai</H3>blablabla<H3>Second essai</H3>blobloblo" ;

tu vas comprendre pourquoi on dit que l'étoile est gourmande (greedy)...

une solution serait par ex. :

/<H3.*?>(.*?)</H3>/s

ou encore, en supposant qu'il n'y a pas de > dans les attributs de ton H3 :
/<H3[^>]*>(.*?)</H3>/s


Ca veut dire quoi [^>] ?


n'importe quel caractère sauf >. Par exemple [^0-9,.] c'est n'importe
quel caractère sauf un chiffre, un point ou une virgule.

En fait, ce que je veux faire, c'est de parser le fichier bookmark créé par
Firefox et donc je voulais récupérer tout ce qu'il y avait entre <DL> et </DL>
et cela ne tenait pas sur une seule ligne.
Une fois que j'avais obtenu le contenu de ma variable, je la repassais dans la
même fonction pour voir s'il y avait d'autres <DL></DL> et sinon, j'utilisais la
fonction pour voir ce qu'il y avait dans les <H3></H3>
et donc, pour le regex du <DL></DL>, il y avait d'autres ">" dans le contenu.


avec <H3[^>]*> je ne l'utilise pas dans le contenu, mais pour déterminer
la fin de la balise. Donc avec <DL><H3>sdlkfjlk</H3><DL> ça marche, mais
s'il y avait <H3 name="toto>tata"> là ça s'arrêterait à tort après toto.
A priori, avec tes données tu ne risques rien.

enfin, tu as tout intérêt à prévoir qu'on écrive h3 en minuscules, donc
à ajouter le /i


les H3 sont en majuscules. A quoi sert le /i ?


Comme c'est un logiciel qui écrit ton fichier, tu peux raisonnablement
supposer que tes H3 seront tj en majuscules, donc le /i ne te sert à
rien. Avec un rédacteur humain, ou si tu étais amené à te resservir de
la regex dans d'autres circonstances, il faudrait prévoir un h3 au lieu
de H3, les deux étant indifférents d'un point de vue HTML.