2010-07-17 5 views
2

J'ai cette fonction pour analyser bbcode -> HTML:bbcode unparser regex aide

$this->text = preg_replace(array(
    '/\[b\](.*?)\[\/b\]/ms', 
    '/\[i\](.*?)\[\/i\]/ms', 
    '/\[u\](.*?)\[\/u\]/ms', 
    '/\[img\](.*?)\[\/img\]/ms', 
    '/\[email\](.*?)\[\/email\]/ms', 
    '/\[url\="?(.*?)"?\](.*?)\[\/url\]/ms', 
    '/\[size\="?(.*?)"?\](.*?)\[\/size\]/ms', 
    '/\[youtube\](.*?)\[\/youtube\]/ms', 
    '/\[color\="?(.*?)"?\](.*?)\[\/color\]/ms',  
    '/\[quote](.*?)\[\/quote\]/ms', 
    '/\[list\=(.*?)\](.*?)\[\/list\]/ms', 
    '/\[list\](.*?)\[\/list\]/ms', 
    '/\[\*\]\s?(.*?)\n/ms' 
    ),array(
    '<strong>\1</strong>', 
    '<em>\1</em>', 
    '<u>\1</u>', 
    '<img src="\1" alt="\1" />', 
    '<a href="mailto:\1">\1</a>', 
    '<a href="\1">\2</a>', 
    '<span style="font-size:\1%">\2</span>', 
    '<object width="450" height="350"><param name="movie" value="\1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="\1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="450" height="350"></embed></object>', 
    '<span style="color:\1">\2</span>', 
    '<blockquote>\1</blockquote>', 
    '<ol start="\1">\2</ol>', 
    '<ul>\1</ul>', 
    '<li>\1</li>' 
    ),$original); 

problème est, comment unparse cela, comme html -> bbcode?

Mes compétences regex sont pauvres :(

Merci.

Répondre

7

ne pas.

Au lieu de cela, stocker à la fois le texte d'origine unparsed et le transformé texte analysé. Oui, cela double l'exigence de stockage, mais elle rend aussi aveuglante facile à:

  1. Autoriser les modifications utilisateur de l'original sans l'analyse du BBCode retour sur
  2. Allow citations d'autres messages de l'utilisateur, encore une fois sans analyse syntaxique
  3. Modifier le code HTML chaque BBCode génère (juste réanalysera chaque poste)
  4. commutateur moteurs BBCode la ligne (encore une fois, tout simplement ré-analyser chaque poste)
+0

+1 Si en effet les données ont été disponibles en format BBCode ce serait de loin préférable. – Wrikken

+0

Merci, je pense que c'est une meilleure approche que ce que je pensais au départ. – Rodrigo

5

Il est assez sûr de dire qu'il est presque impossible de construire une fiable moyen de convertir html à BBcode avec juste un tas de regexes. Utilisez un analyseur (DOMDocument par exemple), supprimer des éléments non valides & attributs avec inspection de XPath & puis marcher récursivement créer une chaîne de BBcode sur le chemin (ou tout simplement ignorer les balises invalides/attributs sur le chemin).

+0

Merci! Tony le poney ne viendra pas. –

+0

Euh, vous voulez clarifier? "Tony le poney ne viendra pas." est un peu cryptique à mon goût;) – Wrikken

+0

Puisque BBCODE a une structure récursive comme HTML, ceci s'applique: http://stackoverflow.com/a/1732454/193892 –

3

Si vous savez exactement ce que le code HTML wa nt à de-bbcode a été en-bbcodé en utilisant votre méthode, que ce qui suit:

Basculez les deux tableaux que vous passez à preg_replace.

Dans le tableau avec le code HTML, procédez comme suit pour chaque élément: Ajoutez # à la chaîne. Ajouter #s. Remplacez \1 (et \2 aso) par (.*?).

Pour le tableau avec les bbcodes, effectuez les opérations suivantes avec chaque élément: Supprimez / au début et /ms à la fin. Remplacez \s par . Enlever tout \. Enlever tout ?. Remplacez le premier (.*) dans la chaîne avec $1 et le second avec $2.

Cela devrait faire. Si des problèmes: Demander;)