Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1464 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] Regex du tonnerre de Zeus

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PHP] Regex du tonnerre de Zeus

n°1357836
godbout
Génial.
Posté le 02-05-2006 à 14:54:51  profilanswer
 

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
mood
Publicité
Posté le 02-05-2006 à 14:54:51  profilanswer
 

n°1357851
Djebel1
Nul professionnel
Posté le 02-05-2006 à 15:16:12  profilanswer
 

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
n°1357853
chaced
Posté le 02-05-2006 à 15:19:22  profilanswer
 

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
n°1357909
godbout
Génial.
Posté le 02-05-2006 à 16:38:10  profilanswer
 

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

n°1358561
godbout
Génial.
Posté le 03-05-2006 à 13:04:35  profilanswer
 

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
n°1358599
chaced
Posté le 03-05-2006 à 13:38:59  profilanswer
 

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
n°1358693
sielfried
Posté le 03-05-2006 à 15:19:14  profilanswer
 

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
n°1359439
godbout
Génial.
Posté le 04-05-2006 à 12:40:56  profilanswer
 

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.

n°1359440
chaced
Posté le 04-05-2006 à 12:42:17  profilanswer
 

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


---------------
CPU-Z | Timespy | Mes bd
n°1359442
godbout
Génial.
Posté le 04-05-2006 à 12:42:48  profilanswer
 

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]

mood
Publicité
Posté le 04-05-2006 à 12:42:48  profilanswer
 

n°1359445
godbout
Génial.
Posté le 04-05-2006 à 12:43:54  profilanswer
 

chaced a écrit :

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


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

n°1359449
chaced
Posté le 04-05-2006 à 12:45:29  profilanswer
 

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


---------------
CPU-Z | Timespy | Mes bd
n°1359452
godbout
Génial.
Posté le 04-05-2006 à 12:51:23  profilanswer
 

Je teste ça tout de suite.

n°1359454
godbout
Génial.
Posté le 04-05-2006 à 12:52:18  profilanswer
 

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

n°1359459
chaced
Posté le 04-05-2006 à 12:57:27  profilanswer
 

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
n°1359464
godbout
Génial.
Posté le 04-05-2006 à 13:04:41  profilanswer
 

Oui, tu as entièrement raison :)

n°1359465
chaced
Posté le 04-05-2006 à 13:05:46  profilanswer
 

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
n°1359467
sielfried
Posté le 04-05-2006 à 13:06:30  profilanswer
 

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
n°1359477
Djebel1
Nul professionnel
Posté le 04-05-2006 à 13:12:34  profilanswer
 

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".

n°1359481
chaced
Posté le 04-05-2006 à 13:15:10  profilanswer
 

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
n°1359495
Djebel1
Nul professionnel
Posté le 04-05-2006 à 13:23:54  profilanswer
 

oups pardon :x

n°1359500
godbout
Génial.
Posté le 04-05-2006 à 13:31:07  profilanswer
 

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]

n°1359707
godbout
Génial.
Posté le 04-05-2006 à 15:20:34  profilanswer
 

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]

n°1359718
godbout
Génial.
Posté le 04-05-2006 à 15:35:17  profilanswer
 

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.

n°1365949
godbout
Génial.
Posté le 14-05-2006 à 18:01:40  profilanswer
 

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 ? :??:

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] Regex du tonnerre de Zeus

 

Sujets relatifs
En PHP, comment placer les données d'un XML dans MySQL avec XSLT ?[PHP/Active Directory] Problème d'accès au groupe AD avec PHP
[PHP] Extraire les liens http dans un code source htmlFonction de recherche en PHP
[PHP ] Séparer un tableaucommande PHP pas bien !!
[PHP]Tableau à 2 dimensionsPhP et Mysql5
Récupération des données de formulaires via PHP[PHP] Bug étrange avec strftime (résolu)
Plus de sujets relatifs à : [PHP] Regex du tonnerre de Zeus


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR