expression reguliere preg_replace

expression reguliere preg_replace - PHP - Programmation

Marsh Posté le 23-01-2006 à 11:57:56    

bonjour,
je voudrais remplacer dans une variable certaines chaines de caractère par d'autres.
plus précisement, les balises <a href= ...>...</a> deviendront [LIEN=...]...[/LIEN] et <a href="mailto:...>...</a> deviendront [MAIL]...[MAIL]
 
j'ai fais ceci :

Code :
  1. <?
  2. $texte='<a href="http://monsite.fr">visiter</a><br><a href="mail:contact@monsite.fr">contact@monsite.fr</a>';
  3. $texte = preg_replace('`\<a href="([^[]+)\">([^[]+)\</a>`s', '[LIEN=$1]$2[/LIEN]', $texte);
  4. $texte = preg_replace('`\<a href="mailto:([^[]+)\">([^[]+)\</a>`s', '[MAIL]$1[/MAIL]', $texte);
  5. echo $texte;
  6. ?>

mais ca ne marche pas tres bien!
 
comment faire?
 
merci de votre aide

Reply

Marsh Posté le 23-01-2006 à 11:57:56   

Reply

Marsh Posté le 23-01-2006 à 12:24:06    

Moi j'aurais plus fait comme ça:

Code :
  1. <?php
  2. $texte='<a href="http://monsite.fr">visiter</a><br><a href="mailto:contact@monsite.fr">contact@monsite.fr</a>';
  3. $pattern = array (
  4.   '#<a href="mailto:(.*?)">(.*?)</a>#i',
  5.   '#<a href="(.*?)">(.*?)</a>#i'
  6. );
  7. $replace = array(
  8.   "[MAIL]$1[/MAIL]",
  9.   "[LIEN=$1]$2[/LIEN]"
  10. );
  11. $texte = preg_replace($pattern, $replace, $texte);
  12. echo $texte;
  13. ?>


Mais fait bien attention à l'ordre dans lequel tu définis tes patterns, parce que si tu mets LIEN avant MAIL, vu que le masque est LIEN est valide sur les chaines MAIL ( oups pas sur d'être clair), tu n'auras jamais de MAIL...

Message cité 1 fois
Message édité par anapajari le 23-01-2006 à 12:24:22
Reply

Marsh Posté le 23-01-2006 à 12:29:51    

anapajari a écrit :


Mais fait bien attention à l'ordre dans lequel tu définis tes patterns, parce que si tu mets LIEN avant MAIL, vu que le masque est LIEN est valide sur les chaines MAIL ( oups pas sur d'être clair), tu n'auras jamais de MAIL...


 
 
C'est exactement ce que j'allais dire :)

Reply

Marsh Posté le 24-01-2006 à 16:22:42    

merci beaucoup !!!  
par contre j'ai un petit soucis dans le sans inverse
 
ex:


[B][/B] me donne  
[[B]][<[/B]l<<font class="t[IMG]tre[/IMG]>><<</font>">>ul>B]
alors que je devrais avoir <b></b>
[U][/U] me donne  
[[U]][<[/U]l<<font class="t[IMG]tre[/IMG]>><<</font><font class="t">tre">><u>l><</font>u>]
alors que je devrais avoir <u></u>


 
voici mon code :

Code :
  1. $pattern = array ( 
  2. '#[MAIL](.*?)[/MAIL]#i', 
  3. '#[LIEN=(.*?)](.*?)[/LIEN]#i',
  4. '#[LIST]

    • (.*?)#i',
    • '#[*](.*?)#i',
    • '#[/LIST]#i',
    • '#[I](.*?)[/I]#i',
    • '#[U](.*?)[/U]#i',
    • '#[B](.*?)[/B]#i',
    • '#[TITRE](.*?)[/TITRE]#i',
    • '#[IMG](.*?)[IMG]#i'
    • );
    • $replace = array(  '
    • <a href="mailto:$1">$1</a>', 
    • '<a href="$1">$2</a>',
    • '<ul><li>$1',
    • '</li><li>$1',
    • '</li></ul>',
    • '<i>$1</i>',
    • '<u>$1</u>',
    • '<b>$1</b>',
    • '<font class="titre">$1</font>',
    • '<img src="$1">'
    • );
    • $descript2 = preg_replace($pattern, $replace, $descript2);


je n'y comprends rien  :ange:  
 
merci de votre aide


Message édité par attentio le 24-01-2006 à 16:26:45
Reply

Marsh Posté le 24-01-2006 à 19:33:49    

plus simplement :

Citation :

[B]ca marche pas[/B] devient ]<r>[]ca marche pas[/B]


Code :
  1. <?
  2. //marche
  3. $texte='<b>ca marche</b>';
  4. echo $texte;
  5. $pattern2 = array ('#<b>(.*?)</b>#i',);
  6. $replace2 = array("[B]$1[/B]" );
  7. $texte = preg_replace($pattern2, $replace2, $texte);
  8. echo '<br>->'.$texte;
  9. //ne marche pas
  10. $texte2="<br>[B]ca marche pas[/B]";
  11. $pattern = array ('#[B](.*?)[/B]#i');
  12. $replace = array('<b>$1</b>');
  13. $texte2 = preg_replace($pattern, $replace, $texte2);
  14. echo '<br>'.$texte2;


 
merci infiniment

Reply

Marsh Posté le 24-01-2006 à 22:53:01    

[B] veut dire que tu remplace les caractère compris dans l'ensemble [...] (c'est à dire "B" ...
 
donc [B] deviendra [[B]]
 
Il faut penser à échapper les caractères spéciaux ;)
 
\[B\]


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 24-01-2006 à 22:54:02    

Si tu t'en sors pas, tu peux aussi utiliser preg_quote qui le fait à ta place


---------------
Gamertag: CoteBlack YeLL
Reply

Sujets relatifs:

Leave a Replay

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