Regex, encore =/

Mammouth du PHP | 531 Messages

04 juil. 2008, 20:18

Bonjour,

Encore un problème avec les regex.

Je cherche par exemple à remplacer les commentaires HTML.
Le problème avec mon code c'est que lorsque que j'ai plusieurs commentaires, il remplace du premier <!-- qu'il trouve au dernier -->
Sauf qu'entre j'ai des choses qui ne devraient pas être remplacés.

Concrètement le code ci dessous donne le résultat : toto youpi plouf
Mais le résultat recherché est : toto youpi plouf toto youpi plouf

Si je pouvais remplacer PHP, je ferais " cherche le --> le plus proche du <!-- que tu viens de rencontrer mais impossible de transcrire ça en code...


$chaine = 'toto <!-- commentaire --> plouf toto <!-- commentaire --> plouf';
$pattern = '#(<!--([^"]+)-->)#';
$newchaine = NULL;
preg_match_all( $pattern , $chaine, $matches);
foreach ( $matches[0] as $v )
{
	$newchaine .= str_replace( $matches[0], 'youpi', $chaine );
}

Mammouth du PHP | 1668 Messages

04 juil. 2008, 21:07

Bonjour,

Je serais toi, j'utiliserais l'option U, c'est pour non-glouton, ça s'arrêtera au premier --> rencontré :

http://www.siteduzero.com/tuto-3-150-1- ... #ss_part_7
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

Mammouth du PHP | 531 Messages

04 juil. 2008, 21:14

Bonjour,

Je serais toi, j'utiliserais l'option U, c'est pour non-glouton, ça s'arrêtera au premier --> rencontré :

http://www.siteduzero.com/tuto-3-150-1- ... #ss_part_7
Ah merci c'est ça que je cherchais. C'est tellement spécial les syntaxes regex que c'est dure de retenir...
Par contre je me demande bien pourquoi j'ai fait un foreach... ça sert complètement à rien.

Mammouth du PHP | 1668 Messages

05 juil. 2008, 09:46

Les REGEX sont complexe, c'est marrant et pénible à la fois, si tu veux testé tes REGEX je te conseil ce site :
http://lumadis.be/regex/test_regex.php?lang=fr
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

Mammouth du PHP | 531 Messages

04 nov. 2008, 13:54

Je réouvre le topic et je confirme que c'est vraiment pénible les regex mais on pourrais pas s'en passer en même temps :D

Alors voilà, je tente de parser du HTML. JE cherche par exemple à récupérer le contenu des balises titre ( h1, h2, etc... )
preg_match( '#(?<=<h)(.*)(>)(.*)(?=</h)#siU', $body[1], $h1 )
J'ai prévu qu'il puisse y avoir n'importe quoi à l'ouverture des balises du genre <h1 class="toto">.
Mais alors juste prévu car dans la pratique ça ne marche pas du tout.

Voici par exemple le genre de résultat que j'ai sur un h1 contenant une classe css :

> 1 class="logo"> ... etc

Mammouth du PHP | 1668 Messages

04 nov. 2008, 14:18

Pour faire simple :

Code : Tout sélectionner

#<h([0-9]+)([^>]*)>(.*)<\/h\1>#isU
Je l'ai testé sur :
<h1 class="toto">montruc</h1>
Ca me renvois :
[0]=><h1 class="toto">montruc</h1>
[1]=>1
[2]=> class="toto"
[3]=>montruc
Pour expliquer mon REGEX :
je cherche tout ce qui commence par "<h" pour un ou plusieurs chiffre ("<h([0-9]+)") qui se finit par "<h", la première classe trouvé et ">" ("<\/h\1>" (cf. plus bas). dans la balise d'ouverture (jusqu'à ">") il peut y avoir tout sauf ">" ("([^>]*)"), j'ai dit il peut, donc "*". enfin on veux récupérer ce qu'il y a dans les balise ("(.*)")

Pour mon cf : quand on veux récupérer une classe qu'on a chercher précedement, la classe N°x, on l'appelle via "\x"

Voilà.
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol