2010-08-07 5 views
0

J'ai des citations imbriquées activées dans mon système de messagerie privé, mais maintenant je veux montrer à l'utilisateur une partie du message lorsqu'il survole le titre du message.Tout supprimer entre les balises "quote" ([quote])

Pour extraire le texte approprié du message, je souhaite supprimer les parties de devis.

La structure de citation est la suivante:

[quote] 
    [quote] 
    dasdasa adsadsa ds a 
    [/quote] 

    ddasd asd ads adsasd 
[/quote] 

Comment puis-je supprimer tout entre les balises de citation?

Je l'ai essayé avec le code suivant, mais la dernière partie des citations imbriquées ne supprimerons pas:

while(preg_match('#\[quote=(.*?)\](.*?)\[\/quote\]#si', $message)) { 
    $message = preg_replace('#\[quote=(.*?)\](.*?)\[\/quote\]#si', '', $message, 1); 
} 

while(preg_match('#\[quote\](.*?)\[\/quote\]#si', $message)) { 
    $message = preg_replace('#\[quote\](.*?)\[\/quote\]#si', '', $message, 1); 
} 

Toute suggestion comment supprimer ces citations sur le message? THX!

+2

Félicitations, vous avez connu que les expressions régulières ne peuvent pas être utilisés pour décrire des langues non régulières comme votre * citation * langue. – Gumbo

+0

Mais comme PHP utilise PCRE, pas regex c'est toujours possible. – NikiC

Répondre

1

a) mieux ne pas utiliser ... regex

b) utiliser recursion.

#\[quote](?:(?>[^[])|\[(?!/?quote])|(?R))*\[/quote]# 

Je n'ai pas testé le pcre, mais il devrait le faire.

+0

Ah, j'ai oublié que PCRE peut faire une correspondance récursive. – Gumbo

+0

Pourriez-vous s'il vous plaît me donner un court exemple d'un code récursif? Parce que je pense que ce n'est pas quelque chose que j'apprends dans quelques jours, n'est-ce pas? – Arjen

0

Il n'est pas nécessaire d'appeler preg_match(), puis d'appeler preg_replace(), lorsque preg_replace() peut remplacer toutes les chaînes correspondant à l'expression régulière par un seul appel.

Le problème avec l'expression régulière que vous utilisez est que le code que vous avez signalé produirait la sortie suivante:

ddasd asd ads adsasd 
[/quote] 
+0

C'est exactement ça. – Arjen

Questions connexes