Regex, encore =/

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Regex, encore =/

par katagoto » 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à.

par supercanard » 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

par katagoto » 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

par supercanard » 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.

par katagoto » 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

Regex, encore =/

par supercanard » 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 );
}