defi regexp un peu compliqué..

defi regexp un peu compliqué.. - PHP - Programmation

Marsh Posté le 01-08-2007 à 09:45:36    

Salut ;)
 
Je cherche à porter dynamiquement une balise html de type <font>blabla</font> vers un affichage comme celui ci : <c:style>blabla</c:style> (pour generer des PDF via php..)
 
la balise font originelle peut avoir en argument color et/ou size dans n'importe quel ordre donc :
<font color="#fff000" size="12">blabla/<font> donnera => <c:style:12&#fff000>blabla</c:style>
<font color="#fff000">blabla/<font> donnera => <c:style:null&#fff000>blabla</c:style>
etc..
 
voici la regexp + code auxquels je suis arrivé.. et ca marche dans certain cas.. dans dautre non ! et il n'ya pas vraiment de logique dans les bugs..:

Code :
  1. $finalOutput =  preg_replace_callback(
  2.             '/<font(( +)size="([0-9]+)"|( +)color="(#[0-9a-fA-F]+)" ){1,2}( *)>([. \w!?\-=\+:;,\(\)@°%\*&<>\/€{}\[\]\.~#\|\^²§µ$¤£_"\']*)<\/font>/',
  3.             create_function(
  4.              '$matches',
  5.              '$size = (!empty($matches[3])) ? ":".$matches[3] : ":null";
  6.     $color = (!empty($matches[5])) ? "&".$matches[5] : "&null";
  7.     $output = "<c:style".$size.$color.">".$matches[7]."</c:style>";
  8.     return $output;'
  9.      ),
  10.             $output);


 
ps:j'ai du me taper tous les caracteres speciaux a la main.. c'est pour des test car le PDF bug sur certain caracteres.. c'est assez bizarre.. ca ne marche pas mieu si je met  un (.*) ou  un ([^<\/font> ) au milieu
 
le probleme : la plupart du temps que j'ai plusieurs couleurs dans un meme bloc de texte, le code ne prend que la premiere balise <font et la derniere balise </font fermante.. (et encore ca part en sucette un peu n'importe comment..) :

Citation :

remise s</font>up<font color="#00CCFF">lle</font>nmtaeire
d<font color="#0000FF">e 36| Yaho<font
color="#CCFFFF">uu</font> <font color=
 
"#CCFFFF">c'est</font>
exceptionne
l...


 
A l'aide ?


Message édité par bixibu le 01-08-2007 à 09:47:25
Reply

Marsh Posté le 01-08-2007 à 09:45:36   

Reply

Marsh Posté le 01-08-2007 à 10:06:29    

quel est l'interêt de le faire en une seule regex?
AMA tu vas vraiment en chier pour réussir à la faire marcher dans tous les cas et ça n'aura que des inconvénients ( truc illisible et imbittable, le moindre changement risque de tout foutre en l'air).
Perso je ferais ça en trois regex dans le genre:


/<(/?)font/<$1c:style:/gi;
/<c:style:(.*?)(size="(\d+)"|)>/<c:style:($2==''?'null':$2)&$1/egi;
/<c:style(.*?)&(.*?)color="(.*?)"/<c:style$1&$3/ig;


c'est ecrit à la perl, à toi d'adapter à preg_*


Message édité par anapajari le 01-08-2007 à 10:07:55
Reply

Marsh Posté le 01-08-2007 à 10:16:48    

le probleme c'eset que j'utilise la fonction preg_replace_callback qui, il me semble, ne prend en argument qu'un pattern seul.. (donc sur une ligne)..
 
Mais bon de toute facon je vais virer la gestion de l'attribut size ce qui allege ma regexp.. mais le probleme reste le meme.. ce qui merde c'est ce qu'il y a à l'interieur des 2 balises font ouvrante / fermantes.. un (.*) devrait suffire mais ce n'est pas le cas..
plein de couleurs sur un ligne de carateres tout attaché (sans espaces) = NIKEL
si il ya des espaces (et encore ca depend où ils sont placés): ca merde.
 
merci de te pencher sur ce probleme en tous cas

Reply

Sujets relatifs:

Leave a Replay

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