[PHP] Problème de parser

Problème de parser [PHP] - PHP - Programmation

Marsh Posté le 27-08-2005 à 12:28:45    

Bjour tout le monde!
Voila, j'ai décidé de me faire un ptit parser, et j'ai quelques questions.
D'abord je voudrais remplacer les [] par des <>, mais je sais pas pourquoi, sa marche pas. Pour l'instant je dosi faire mes tests avec des -tirets mais c'est pas super satifaisant. Quelqu'un sait d'où vient le problème?
 
 
Ensuite, j'ai un problème au niveau des images. J'essaye de me faire une balise <image>adresse_de_l'image</image> (ou plutot -image-adresse_de_l'image-/image- X( ) Mais sa marche pas, il m'affiche le code tel-quel, en mettant un lien cliquable. Pour info,

Code :
  1. $texte = preg_replace('!http://[a-z0-9._/-]+!i', '<a href="$0">$0</a>', $texte); // Remplace les URLs "bruts" en liens cliquables     
  2. $texte = preg_replace('!-url=(http://[a-z0-9._/-]+)-(.+)-/url-!isU', '<a href="$1">$2</a>', $texte); // Remplace les URLs "bruts" par du texte     
  3. $texte = preg_replace('![a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}!iU', '<a href="mailto:$0">$0</a>', $texte); // Remplace les adresses mails "brutes" en adresses mails cliquables     
  4. $texte = preg_replace('!http://[a_z0-9._/-]+\.(jpg|jpeg|png|gif|bmp|tga)!iU', '<img src="$0" alt="Mon Image" />', $texte); // Affiche directement les images au lieu d'afficher les URLs


 
Voici mes regex concernant les urls et adresses mails. Jpense pas que la premiere regex bloque la derniere, si?
 
J'ai cherché un peu dans la doc php, et j'ai rien trouvé de satisfaisant (à vrai dire j'ai surtout cherché pour les délimiteurs :))
Voila. Merci si vous pouvez m'expliquer d'ou vient le problème :)


Message édité par baiterave le 27-08-2005 à 12:33:09
Reply

Marsh Posté le 27-08-2005 à 12:28:45   

Reply

Marsh Posté le 27-08-2005 à 12:59:08    

A première vue la première règle bloque la dernière si, faudrait les inverser. [:figti]  
 
Pour le coup du remplacement des [] par des <>, faudrait voir comment tu écris ta/tes règle(s).


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 27-08-2005 à 13:55:35    

idem que sielfried, si tu veux utiliser des regexp en série, il faut toujours mettre d'abords la régle dont tous les cas sont aussi intercepté par une régle moins restrictive. Si c'est pas mis dans ce sens là, la régle la plus restrictive ne trouvera rien.  
 
Aussi, il faut faire attention que le changement généré par un des changements ne soit pas intercepté par un autre regexp, sinon tu risques de chercher longtemps d'où vient le probléme.
 
Quand à ton parser, on poura pas t'aider sans que tu nous montre la partie du code qui pose probléme.

Reply

Marsh Posté le 27-08-2005 à 23:39:54    

Vous vouelz que je vous montre quoi exactement? Une seule RegExp suffit pour les balises <>, ou vous voulez l'intégralité de mon parser?  
 
(attention il est plutot gros :D)

Reply

Marsh Posté le 27-08-2005 à 23:47:20    

Ben montre les regexp qui font pas ce que tu voudrais. -_-


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 28-08-2005 à 00:04:21    

ben les seuls problèmes qui persistent sont les images (sa marche toujours pas  :??: )
et les délimitations.  
 
Jposte mon code allegé :  

Code :
  1. $contenu = preg_replace('!\*gras\*(.+)\*/gras\*!isU', '<strong>$1</strong>', $contenu); // Pour mettre le texte en gras
  2.     $contenu = preg_replace('!\*italique\*(.+)\*/italique\*!isU', '<em>$1</em>', $contenu); // Pour mettre le texte en italique
  3. $contenu = preg_replace('!\*souligne\*(.+)\*/souligne\*!isU', '<ins>$1</ins>', $contenu); //Pour souligner le texte
  4. $contenu = preg_replace('!\*barre\*(.+)\*/barre\*!isU', '<s>$1</s>', $contenu); // Pour barrer le texte
  5. $contenu = preg_replace('!\*titre1\*(.+)\*/titre\*!isU', '<ins><strong><span style="font-size: 35px;">$1</span></strong></ins>', $contenu); // Titre très important : 35px, gras, souligné
  6. $contenu = preg_replace('!\*titre2\*(.+)\*/titre\*!isU', '<ins><strong><span style="font-size: 25px;">$1</span></strong></ins>', $contenu); // Titre assez important : 25px, gras, souligné
  7. $contenu = preg_replace('!\*titre3\*(.+)\*/titre\*!isU', '<ins><span style="font-size: 15px;">$1</span></ins>', $contenu); // Titre peu important : 15px, souligné
  8. $contenu = preg_replace('!http://[a_z0-9._/-]+\.(jpg|jpeg|png|gif|bmp|tga)!iU', '<img src="$0" alt="Mon Image" />', $contenu); // Affiche directement les images au lieu d'afficher les URLs
  9. $contenu = preg_replace('!http://(www\.)?([a-z0-9._/-]+)!i', '<a href="$0">$0</a>', $contenu); // Remplace les URLs bruts en liens cliquables
  10. $contenu = preg_replace('![a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}!iU', '<a href="mailto:$0">$0</a>', $contenu); // Remplace les adresses mails brutes en adresses mails cliquables


 
Voila, je crois que c'est bon. Donc, mes problèmes sont les délimiteurs et les images.
Merci :)

Reply

Marsh Posté le 28-08-2005 à 00:29:08    

Pour les images j'viens de remarquer que t'as [a_z0-9._/-]+ au lieu de [a-z0-9._/-]+, donc forcément, ça capte rien. Un petit i en option ferait pas de mal non plus.
 
Quant aux délimiteurs, c'est quoi le problème, concrètement ?...


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 28-08-2005 à 01:20:28    

ben, les délimiteurs, comme tu peux le voir j'utilise pour l'instant des étoiles (*gras* Texte en gras */gras*)
Et quand je remplace les étoiles par des <> ben sa marche plus : au lieu de m'afficher du texte en gras, il m'affiche <gras>Texte en gras.</gras>
 
Jvai tester pour les images ;)

Reply

Marsh Posté le 28-08-2005 à 01:25:22    

$contenu = preg_replace('!http://[a_z0-9._/-]+\.(jpg|jpeg|png|gif|bmp|tga)!iU', '<img src="$0" alt="Mon Image" />', $contenu);
 
Normalement si je tape http://www.monsite.com/image.png sa devrait automatiquement remplacer par l'image elle même, non? Parceque la il m'affiche directement l'URL...

Reply

Marsh Posté le 28-08-2005 à 09:44:01    

Ben je t'ai expliqué que t'avais mis a_z au lieu de a-z, ce qui fait foirer ton masque.
 
Pour le délimiteur <> tu mets bien des \ avant ?

Code :
  1. preg_replace('#\<italique\>(.+)\<italique\>#i', '<em>$1</em>', $contenu);

marche.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Sujets relatifs:

Leave a Replay

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