[PHP] Regex du tonnerre de Zeus

Regex du tonnerre de Zeus [PHP] - PHP - Programmation

Marsh Posté le 02-05-2006 à 14:54:51    

J'me mets aux regex en essayant de gérer quelques bbcode, j'ai eu un problème, je l'ai résolu, mais je ne comprends pas pourquoi ça ne marchait pas [:ocube]
 
Voilà mon ex-code :
 

Code :
  1. $HTML = preg_replace( '\[b\]', '<b>', $BBCode );


 
J'me suis retrouvé avec mes

[b]

remplacés par des

[<b>]

et il me semble mes

[/b]

par des

[</b>]


 
J'ai pas compris pourquoi :D
En ajoutant des parenthèses dans le regex comme ceci '(\[b\])' ça a marché, miraculeusement.
 
Where is the problem?
 
 
PS: Je tiens à préciser que j'ai lu tous les topics sur le forum et sur google.


Message édité par godbout le 02-05-2006 à 14:57:13
Reply

Marsh Posté le 02-05-2006 à 14:54:51   

Reply

Marsh Posté le 02-05-2006 à 15:16:12    

le pattern doit pas être délimité avec preg_replace ?
genre preg_replace( '/\[b\]/', '<b>', $BBCode )
Auquel cas tes parenthèses ont ptet joué le rôle de délimiteur.
 
J'ai pas testé et je dis surement des conneries étant un grand professionnel averti des regex !


Message édité par Djebel1 le 02-05-2006 à 15:16:48
Reply

Marsh Posté le 02-05-2006 à 15:19:22    

Oui preg a besoin de délimiteur, perso j'utilise des @ mais on peut utiliser ce que l'on veut.


---------------
CPU-Z | Timespy | Mes bd
Reply

Marsh Posté le 02-05-2006 à 16:38:10    

Ah merde, j'avais pas vu ça quand j'ai lu la doc :??:
Bon ben j'y retourne, merci beaucoup [:dawao]

Reply

Marsh Posté le 03-05-2006 à 13:04:35    

Cool, j'ai fait un truc comme ça donc :  
 

Code :
  1. preg_replace( '/\[([ibu])](.*?)\[\/\1]/', '<$1>$2</$1>', $BBCode );


 
C'est rigolo, ça marche. [:dawao]
Enfin à moitié, parce que si j'imbrique des balises, ça marche plus [:tinostar]

Message cité 1 fois
Message édité par godbout le 03-05-2006 à 13:05:14
Reply

Marsh Posté le 03-05-2006 à 13:38:59    

utilise des span pour l'imbrication ;)
 
Comme ça ton  

Code :


 
Devient  

Code :
  1. <span class="bold"><span class="italic"></span></span>


:D

Message cité 1 fois
Message édité par chaced le 03-05-2006 à 13:39:11

---------------
CPU-Z | Timespy | Mes bd
Reply

Marsh Posté le 03-05-2006 à 15:19:14    

godbout a écrit :

Cool, j'ai fait un truc comme ça donc :  
 

Code :
  1. preg_replace( '/\[([ibu])](.*?)\[\/\1]/', '<$1>$2</$1>', $BBCode );


 
C'est rigolo, ça marche. [:dawao]
Enfin à moitié, parce que si j'imbrique des balises, ça marche plus [:tinostar]


 
Tu peux faire un truc récursif, style :
function rec_replace($string) {
   return preg_replace('#\[([ibu])](.*?)\[\/\1]#ie', '"<$1>" . rec_replace("$2" ) . "</$1>"', $string);
}
 
Sinon il faut gérer ça par type de balise et repasser plusieurs fois.

Message cité 1 fois
Message édité par sielfried le 03-05-2006 à 15:19:21

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 04-05-2006 à 12:40:56    

chaced a écrit :

utilise des span pour l'imbrication ;)
 
Comme ça ton  

Code :


 
Devient  

Code :
  1. <span class="bold"><span class="italic"></span></span>


:D


Je ne sais pas pourquoi, mais je sens que la blague était intense.

Reply

Marsh Posté le 04-05-2006 à 12:42:17    

Qu'elle blague ? ça marche tres bien...


---------------
CPU-Z | Timespy | Mes bd
Reply

Marsh Posté le 04-05-2006 à 12:42:48    

sielfried a écrit :

Tu peux faire un truc récursif, style :
function rec_replace($string) {
   return preg_replace('#\[([ibu])](.*?)\[\/\1]#ie', '"<$1>" . rec_replace("$2" ) . "</$1>"', $string);
}
 
Sinon il faut gérer ça par type de balise et repasser plusieurs fois.


Ok, merci pour l'info [:super chinois]
De toute façon c'était qu'un essai, j'vais gérer que les [img] et les [url], donc je vais repasser plusieurs fois :jap:
 
 
Par contre, un p'tite question, j'capte pas la différence entre un  
 

Code :
  1. (.*)


et un  

Code :
  1. (.*?)


 
Dans les deux j'y lis : 0 ou plusieurs occurences de n'importe quoi. J'vois pas ce que le ? vient ajouter [:dawao]

Reply

Marsh Posté le 04-05-2006 à 12:42:48   

Reply

Marsh Posté le 04-05-2006 à 12:43:54    

chaced a écrit :

Qu'elle blague ? ça marche tres bien...


C'te rapidité :ouch:
Disons que la solution ne me convient pas [:ohtusais]

Reply

Marsh Posté le 04-05-2006 à 12:45:29    

En tout cas ça marche tres bien sur les forums mon astuces :D


---------------
CPU-Z | Timespy | Mes bd
Reply

Marsh Posté le 04-05-2006 à 12:51:23    

Je teste ça tout de suite.

Reply

Marsh Posté le 04-05-2006 à 12:52:18    

<strong>Je teste ça <em>tout de </em>suite.</strong>
 
Bon, ça m'avance guère :D

Reply

Marsh Posté le 04-05-2006 à 12:57:27    

godbout a écrit :

<strong>Je teste ça <em>tout de </em>suite.</strong>
 
Bon, ça m'avance guère :D


 
ce n'est pas du tout w3c ce truc :(  
 
pour faire un truc comme ça :  

Code :
  1. abc


 
il faudrait ecrire :
<b>a</b><i><b>b</b>c</i>

Message cité 1 fois
Message édité par chaced le 04-05-2006 à 12:59:06

---------------
CPU-Z | Timespy | Mes bd
Reply

Marsh Posté le 04-05-2006 à 13:04:41    

Oui, tu as entièrement raison :)

Reply

Marsh Posté le 04-05-2006 à 13:05:46    

c'est pour ça que le coup des span arrive a garder la compatibilité w3c mais au final, ça ne fait pas ce que l'on demande :( (quand on impbrique les balises)


---------------
CPU-Z | Timespy | Mes bd
Reply

Marsh Posté le 04-05-2006 à 13:06:30    

godbout a écrit :

Ok, merci pour l'info [:super chinois]
Par contre, un p'tite question, j'capte pas la différence entre un  
 

Code :
  1. (.*)


et un  

Code :
  1. (.*?)




 
Le ? rend le * feignant ("lazy" ). Exemple simple, sur une chaîne de type : "fooBARfooBARfoo", "foo.*foo" catcherait "fooBARfooBARfoo" (la chaîne entière donc), alors que "foo.*?foo" catcherait "fooBARfoo". Autrement dit, l'étoile s'arrête au premier "foo" si elle est feignante, et au dernier si elle ne l'est pas.  
 
Il y a aussi une option sur les fonctions preg_* pour les rendre feignantes par défaut (U je crois).


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 04-05-2006 à 13:12:34    

chaced a écrit :

ce n'est pas du tout w3c ce truc :(  
 
pour faire un truc comme ça :  

Code :
  1. abc


 
il faudrait ecrire :
<b>a</b><i><b>b</b>c</i>


euh en quoi c'est pas W3C l'usage des balises <strong> et <em> ? Elles ont un sens, contrairement aux balises <b> et <i>, qui elles ne sont là que pour la présentation et n'ont pas de sens. Ce sont donc ces dernières qui "ne sont pas W3C".

Reply

Marsh Posté le 04-05-2006 à 13:15:10    

je parles du sens d'imbrication des balises, genre : <b>a<i>b</b>c</i> pas de la balise en elle meme :)


---------------
CPU-Z | Timespy | Mes bd
Reply

Marsh Posté le 04-05-2006 à 13:23:54    

oups pardon :x

Reply

Marsh Posté le 04-05-2006 à 13:31:07    

sielfried a écrit :

Le ? rend le * feignant ("lazy" ). Exemple simple, sur une chaîne de type : "fooBARfooBARfoo", "foo.*foo" catcherait "fooBARfooBARfoo" (la chaîne entière donc), alors que "foo.*?foo" catcherait "fooBARfoo". Autrement dit, l'étoile s'arrête au premier "foo" si elle est feignante, et au dernier si elle ne l'est pas.  
 
Il y a aussi une option sur les fonctions preg_* pour les rendre feignantes par défaut (U je crois).


Ah ok, merci :o
J'avais déjà vu cette option de fénéantise ouais, mais j'ai cru au début que c'était pour le développeur [:god]
En fait j'avais pas compris comment l'appliquer, maintenant c'est bon, merci [:dawao]

Reply

Marsh Posté le 04-05-2006 à 15:20:34    

J'essaye de gérer les balises [img] et [url]/[url=] en pouvant les imbriquer les unes dans les autres, ça fout à chaque fois tout en l'air [:sisicaivrai]

Reply

Marsh Posté le 04-05-2006 à 15:35:17    

Code :
  1. $search = array( '/\[img]([^][]*)\[\/img]/',
  2.  '/\[url]([^][]*)\[\/url]/',
  3.  '/\[url=([^][]*)](.*)\[\/url]/'
  4. );
  5. $replace = array( '<img src="$1"></img>',
  6.  '<a href="$1">$1</a>',
  7.  '<a href="$1">$2</a>'
  8. );
  9. $HTML = preg_replace( $search, $replace, $BBCode );


 
Voilà mon code. Mais forcément, une fois que les [img] ont été changées en <img src=, ben le regex des url ne marche pas, et ça fait tout foirer.

Reply

Marsh Posté le 14-05-2006 à 18:01:40    

J'ai rajouté les "<" et ">" dans les choses à éviter, et ça marche [:super chinois]
 
Par contre j'ai une autre question [:god]
En ce qui concerne le "^" dans les classes de caractères, j'aurais aimé interdire un mot complet, comment je fais ? :??:
 
Est-ce que [^(mot)] est correct ? :??:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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