petit soucis avec un preg_replace

petit soucis avec un preg_replace - PHP - Programmation

Marsh Posté le 24-11-2003 à 15:15:04    

je voudrais remplacer ça :  
<font face=Arial size=5>test 01</font>
<font face=System>test 02 </font>
<font size=7>test 03</font>

 
en ça :  
[font=Arial][size=5]test 01[/size][/font]
[font=System]test 02 [/font]
[size=7]test 03[/size]

 
j'utilise ça :  
$texte = preg_replace("'\<FONT face=(.*?) size=([1-7])>(.*?)<\/FONT>'si", "[font=\\1][size=\\2]\\3[/size][/font]", $texte);
$texte = preg_replace("'\<FONT face=(.*?)>(.*?)<\/FONT>'si", "[font=\\1]\\2[/font]", $texte);
$texte = preg_replace("'\<FONT size=([1-7])>(.*?)<\/FONT>'si", "[size=\\1]\\2[/size]", $texte);

 
et ça me fait ça :  
[font=Arial][size=5]test 01[/size][/font]
[font=System>test 02 <FONT][size=7]test 03[/size][/font]

 
Comment je peux faire pour qu'il ne me fasse pas ça :  
[font=System>test 02 <FONT]

Reply

Marsh Posté le 24-11-2003 à 15:15:04   

Reply

Marsh Posté le 24-11-2003 à 15:41:11    

euh... question con. il sert à quoi ton backslash en début de chaque regexp?

Reply

Marsh Posté le 24-11-2003 à 15:45:48    

ben deja c'est le contraire, l'expression a verifier est en premier, et la chaine de remplacement en 2nd
 
enfin en tout cas j'ai fait ca ce matin et j'ai fait :

$ToPreg=preg_replace("#\[size=([0-9])\](.*?)\[/size\]#si",'<font size="$1">$2</font>', $ToPreg);


 

Reply

Marsh Posté le 24-11-2003 à 15:50:10    

relis son message...

Reply

Marsh Posté le 24-11-2003 à 15:56:41    

gizmo a écrit :

euh... question con. il sert à quoi ton backslash en début de chaque regexp?


 
Il échappe < qui de toute façon n'est pas un meta-caractère en regexp perl si mes souvenirs sont bons. Donc en gros il ne sert à rien, mais n'empêche pas la regexp de fonctionner correctement.


---------------
Loose Change Lies | Bars | Last.fm
Reply

Marsh Posté le 24-11-2003 à 15:57:05    

ha oui pardon

Reply

Marsh Posté le 24-11-2003 à 15:59:08    

KrisCool a écrit :


 
Il échappe < qui de toute façon n'est pas un meta-caractère en regexp perl si mes souvenirs sont bons. Donc en gros il ne sert à rien, mais n'empêche pas la regexp de fonctionner correctement.


C'est bien ce qu'il me semblait, mais je voulais être sûr. Bon, comme c'est confirmé, je ne vois pas d'où viendrait l'erreur dans ce cas :/

Reply

Marsh Posté le 24-11-2003 à 15:59:49    

je comprend pas pourquoi tu a un ' au debut

Reply

Marsh Posté le 24-11-2003 à 16:36:14    

chacal_one333 a écrit :

je comprend pas pourquoi tu a un ' au debut


 
C'est le délimiteur de la regexp perl.
Toi tu utilises le #, lui une apostrophe simple. Les programmeurs PERL ont tendance à utiliser / pour délimiter les leurs.


---------------
Loose Change Lies | Bars | Last.fm
Reply

Marsh Posté le 24-11-2003 à 17:09:03    

...je nage quand même... :)

Reply

Marsh Posté le 24-11-2003 à 17:09:03   

Reply

Marsh Posté le 24-11-2003 à 17:14:02    

ben remplace ' par #, je crois pas que ' soit valide en php

Reply

Marsh Posté le 24-11-2003 à 17:44:50    

le probleme vient des face=(.*?)
il faut limiter avec [a-zA-Z]+ au lieu de .*?
Teste et approuve :

Code :
  1. $texte = preg_replace("#<font face=([a-zA-Z]+) size=([1-7])>(.*?)</font>#si","[font=$1][size=$2]$3[/size][/font]",$texte);
  2. $texte = preg_replace("#<font face=([a-zA-Z]+)>(.*?)</font>#si","[font=$1]$2[/font]",$texte);
  3. $texte = preg_replace("#<font size=([1-7])>(.*?)</font>#si","[size=$1]$2[/size]",$texte);

Reply

Marsh Posté le 24-11-2003 à 18:14:19    

karamilo a écrit :

le probleme vient des face=(.*?)
il faut limiter avec [a-zA-Z]+ au lieu de .*?
Teste et approuve :

Code :
  1. $texte = preg_replace("#<font face=([a-zA-Z]+) size=([1-7])>(.*?)</font>#si","[font=$1][size=$2]$3[/size][/font]",$texte);
  2. $texte = preg_replace("#<font face=([a-zA-Z]+)>(.*?)</font>#si","[font=$1]$2[/font]",$texte);
  3. $texte = preg_replace("#<font size=([1-7])>(.*?)</font>#si","[size=$1]$2[/size]",$texte);




 
Si tel est le cas, il s'agit d'un bug dans le moteur des regexp. En effet, le ? oblige la regexp à prendre la plus petite expression possible correspondant au pattern.

Reply

Marsh Posté le 24-11-2003 à 18:33:10    

ouaip ca y ressemble fortement.  
en isolant le probleme, on voit que c'est le 1er face= qui fait tout merder.

Reply

Marsh Posté le 25-11-2003 à 13:03:39    

Ca me semble normal vu l'ordre des regexp. Il prend la première regexp et le plus court qu'il peut faire c'est  
<font face=System>test 02 </font>
<font size=7>test 03</font> ça pour matcher ça règle. Un bug aurait été qu'il applique la règle une sur tout ça :<font face=Arial size=5>test 01</font>
<font face=System>test 02 </font>
<font size=7>test 03</font>

Reply

Sujets relatifs:

Leave a Replay

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