Ces satanées expressions régulières...

Ces satanées expressions régulières... - PHP - Programmation

Marsh Posté le 22-12-2003 à 14:58:18    

Novice en la matière d'ereg, je souhaiterai rechercher dans une chaîne la syntaxe suivante:
 
Débutant par : '<!--[' ou '['
Finissant par: ']-->'  ou ']'
 
contenant    : 'value1="value2"'
 
il peut y avoir des espaces après et avant l'egal ainsi qu'au début et à la fin du contenu.
 
Je veux pouvoir retourner dans un tableau value1 et value2 ces valeurs peuvent contenir 'a'-'z' ou 'A'-'Z' ou '_' ou '-'
 
puis en fin de compte, je souhaite en fonction de value1 et de value2 remplacer la chaîne complete recherchée par une valeur value3...
 
Pouvez-vous m'aider ?


---------------
.:coin:.
Reply

Marsh Posté le 22-12-2003 à 14:58:18   

Reply

Marsh Posté le 22-12-2003 à 15:05:33    

J'avais comme idée ceci:
 

Code :
  1. $pat = "[<!--\[|\[]([a-zA-Z_-])\S*=\S*["?([a-zA-Z_-])"?|(([a-zA-Z_-]))][\]-->|\]]"
  2. ereg($pat,$string,$result);
  3. $i = 0;
  4. while($resultat=TraitementResult($result[$i])) {
  5.    $i++;
  6.    $pat2 = "[<!--\[|\[]$resultat[value1]\S*=\S*["?$resultat[value2]"?|(([a-zA-Z_-]))][\]-->|\]]";
  7.    ereg_remplace($pat2, $resultat[value3], $string);
  8. }


 
Evidemment ca marche pas...


Message édité par kalios le 22-12-2003 à 15:06:07

---------------
.:coin:.
Reply

Marsh Posté le 22-12-2003 à 15:40:58    

Bon.. Decidemment je n'ai rien compris du tout...
 
 
En testant la base, je m'apperçois que ca marche pas...
 

Code :
  1. $pattern = "([a-z]*)";
  2. $text    = "je suis une chaine de caractere";
  3. ereg($pattern,$text,$tab);
  4. for($i=0;$tab[$i];$i++) echo($tab[$i]."<BR>\n" );


 
Techniquement ceci ne devrait me placer dans le tableau tab chaque mot de ma chaine ?


Message édité par kalios le 23-12-2003 à 11:13:05

---------------
.:coin:.
Reply

Marsh Posté le 23-12-2003 à 11:12:28    

Arrrrrrrggrrrrr Aidez-moi.. Ca fait des heures que je cherche et ca marche pas....
 
 
Pourquoi:
 

Code :
  1. $pattern = "([a-z]*)";
  2. $text    = "je suis une chaine de caractere";
  3. ereg($pattern,$text,$tab);
  4. for($i=0;$tab[$i];$i++) echo($tab[$i]."<BR>\n" );

 
 
Ne marche pas !!!!!
 
Elle est où mon erreur....
 
 
Flute de Zut de M..de
 
 


---------------
.:coin:.
Reply

Marsh Posté le 23-12-2003 à 11:23:11    

essaye comme ça plutot:

Code :
  1. <?php
  2. $pattern = "([a-z]*)";
  3. $text    = "je suis une chaine de caractere";
  4. preg_match_all($pattern,$text,$tab);
  5. for($i=0;$tab[$i];$i++){
  6.   print_r($tab[$i]);
  7. }
  8. ?>

Reply

Marsh Posté le 23-12-2003 à 12:12:31    

Ok ca ca marche, merci ... Je ne sais pas la différence ntre  
 
pref_match_all et ereg bon....
 
 
Si je complique un peu l'expression par "c([a-z]*)" ca ne fonctionne plus, pourquoi ?  
 
théoriquement je devrais avoir comme résultat: chaine et caractère...


---------------
.:coin:.
Reply

Marsh Posté le 23-12-2003 à 12:13:17    

Kalios a écrit :

Ok ca ca marche, merci ... Je ne sais pas la différence ntre  
 
pref_match_all et ereg bon....
 
 
Si je complique un peu l'expression par "c([a-z]*)" ca ne fonctionne plus, pourquoi ?  
 
théoriquement je devrais avoir comme résultat: haine et aractère...
 


---------------
.:coin:.
Reply

Marsh Posté le 23-12-2003 à 12:16:10    

désolé j'ai oublié un truc dans mon code :o

Code :
  1. $pattern = "/([a-z]*)/";


 
ce qui dans ton deuxieme cas devient:

Code :
  1. $pattern = "/c([a-z]*)/";


 
edit: on peut pas mettre du gras entre les balises cpp?


Message édité par anapajari le 23-12-2003 à 12:16:41
Reply

Marsh Posté le 23-12-2003 à 12:17:44    

Code :
  1. $pat = '/\[([a-zA-Z_]+)="([a-zA-Z_]+)"\]/';
  2. $str = "qertaertyazery<!--[toto=\"abc_rg\"]-->aeryhazerthazrt";
  3. if( preg_match( $pat, $str, $res ) )
  4. {
  5. echo( "<pre>" );
  6. print_r( $res );
  7. echo( "</pre>" );
  8. }


 
Pas la peine de tester <!-- et --> puisque sans ça marche aussi !


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 23-12-2003 à 12:27:50    

mara's dad a écrit :

Code :
  1. $pat = '/\[([a-zA-Z_]+)="([a-zA-Z_]+)"\]/';
  2. $str = "qertaertyazery<!--[toto=\"abc_rg\"]-->aeryhazerthazrt";
  3. if( preg_match( $pat, $str, $res ) )
  4. {
  5. echo( "<pre>" );
  6. print_r( $res );
  7. echo( "</pre>" );
  8. }


 
Pas la peine de tester <!-- et --> puisque sans ça marche aussi !


 
Faut que je test tout ca...  
 
L'idée de tester <!-- et --> est de pouvoir éliminer ces balises de commentaires lors du templacement de chaine


---------------
.:coin:.
Reply

Marsh Posté le 23-12-2003 à 12:27:50   

Reply

Marsh Posté le 23-12-2003 à 12:30:13    

Qu'es-ce que le / dans l'expression régulière ?


---------------
.:coin:.
Reply

Marsh Posté le 23-12-2003 à 12:30:35    

Ben j'ai pas trouvé de truc simple pour inclure <!-- et -->.
Utiliser 2 patterns. La première avec et si çà foire, ben sans :/


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 23-12-2003 à 12:33:21    

Kalios a écrit :

Qu'es-ce que le / dans l'expression régulière ?  


C'est le délimiteur, comme le ' ou " pour une chaîne.
Après le délimiteur, tu peux mettre des codes qui modifient le fonctionnement du pattern
 
Par exemple i pour 'case insensitive'
 
/toto/i
 
Va matcher toto, mais aussi Toto ou TOTO, ToTo...
 
Y'en à d'autres, faut lire la doc :D


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 23-12-2003 à 12:58:30    

Ok ca me parait plus clair qu'avant...
 
Je vous ennuie encore une dernière fois:
 
Je peux avoir dans une chaîne les balises suivantes:
 
<!--[baliseName]-->
[baliseName]
<!--[baliseName=value]-->
[baliseName=value]
[baliseName= value]
<!--[baliseName= "value"]-->
<!--[baliseName="value"]-->
[baliseName="value"]
[baliseName= "value"]
 
donc:
 
le <!-- avec le --> est facultatif  
le " avec le " est facultatif  
 
et le value est facultatif aussi...
 
Comment puis-je faire pour faire des condition ?
 
Dois-je faire plusieurs expressions régulières et tester plusieurs fois la chaine ?


---------------
.:coin:.
Reply

Marsh Posté le 23-12-2003 à 13:07:21    

perso je le ferais en deux fois, tu récupères tout ce qui est entre crochet, et après tu split le résultat sur le = .
Mais en une seule regex c'est jouable ça doit donner un truc comme ça:

Code :
  1. /\[(.*?)(\]|=(.*?)\])/


Attention à pas s'embrouiller entre les resultats dans les différents tableaux.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed