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

  FORUM HardWare.fr
  Programmation
  PHP

  petit soucis avec un preg_replace

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

petit soucis avec un preg_replace

n°574647
xkamui
Their Destiny Was Foreordained
Posté le 24-11-2003 à 15:15:04  profilanswer
 

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]

mood
Publicité
Posté le 24-11-2003 à 15:15:04  profilanswer
 

n°574686
gizmo
Posté le 24-11-2003 à 15:41:11  profilanswer
 

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

n°574696
Profil sup​primé
Posté le 24-11-2003 à 15:45:48  answer
 

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);


 

n°574701
gizmo
Posté le 24-11-2003 à 15:50:10  profilanswer
 

relis son message...

n°574715
KrisCool
“Verbeux„
Posté le 24-11-2003 à 15:56:41  profilanswer
 

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
n°574716
Profil sup​primé
Posté le 24-11-2003 à 15:57:05  answer
 

ha oui pardon

n°574720
gizmo
Posté le 24-11-2003 à 15:59:08  profilanswer
 

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

n°574725
Profil sup​primé
Posté le 24-11-2003 à 15:59:49  answer
 

je comprend pas pourquoi tu a un ' au debut

n°574788
KrisCool
“Verbeux„
Posté le 24-11-2003 à 16:36:14  profilanswer
 

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
n°574860
xkamui
Their Destiny Was Foreordained
Posté le 24-11-2003 à 17:09:03  profilanswer
 

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

mood
Publicité
Posté le 24-11-2003 à 17:09:03  profilanswer
 

n°574863
Profil sup​primé
Posté le 24-11-2003 à 17:14:02  answer
 

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

n°574900
karamilo
Posté le 24-11-2003 à 17:44:50  profilanswer
 

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);

n°574956
gizmo
Posté le 24-11-2003 à 18:14:19  profilanswer
 

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.

n°574976
karamilo
Posté le 24-11-2003 à 18:33:10  profilanswer
 

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

n°575576
belgique
Posté le 25-11-2003 à 13:03:39  profilanswer
 

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>


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

  petit soucis avec un preg_replace

 

Sujets relatifs
Petit Probleme sur les Exceptions[PHP] petit problème (validation de textarea)
Petit probleme; pas de php => pas d'include. Que choisir ?Framset ?[Html - CSS] petit prob de compatibilité...
[C] petit probleme sur un prog tout simple !![C++/gcc 3.2.3] Template, petit bout de code qui ne fonctionne pas
[PHP] petit prob après passage d'easyPhp à BigApache...[VBS] Besoin d un petit coup de main
Petit souci avec DevC++Petit pb :( [MàJ]
Plus de sujets relatifs à : petit soucis avec un preg_replace


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