2010-12-07 58 views
2

Nous venons de publier du code pour rendre notre logiciel un peu plus convivial, et cela s'est retourné contre nous. Fondamentalement, nous essayons de remplacer les nouvelles lignes par des étiquettes <br />. Le problème est, parfois nos utilisateurs entrera code comme le suivant:Compresser les espaces entre les attributs d'une balise HTML

<a 
href='http://nowhere.com'>Nowhere</a> 

Quand nous courons notre code, cela se traduit par

<a <br />href='http://nowhere.com' />Nowhere</a> 

qui ne rend évidemment pas correctement.

Existe-t-il une expression régulière ou une fonction PHP pour supprimer, ou peut-être compresser, les espaces entre les attributs d'une balise HTML?

Clarification: Ce n'est pas du code HTML complet. C'est plus semblable à Markdown ou à une autre langue (nous finirons par passer à Markdown, mais j'ai besoin d'une solution rapide). Donc je ne peux pas simplement analyser cela comme du HTML standard. Les nouvelles lignes doivent être correctement converties en balises <br />.

+0

@ajreal - 'trim()' ne fera que le début et la fin de la chaîne. –

Répondre

1

Après quelques recherches et essais et erreurs, je suis venu avec la solution/hack:

/* 
* Compress all whitespace within HTML tags (including PRE at the moment) 
*/ 
$regexp = "/<\/?\w+((\s+(\w|\w[\w-]*\w)(\s*=\s*(?:\".*?\"|'.*?'|[^'\">\s]+))?)+\s*|\s*)\/?>/i"; 

preg_match_all($regexp, $text, $matches); 

foreach($matches[0] as $match) { 
    $new_html = preg_replace('/\s+/', ' ', $match); 
    $text = str_replace($match, $new_html, $text); 
} 

Après l'exécution de ce code, toutes les balises HTML dans $text seront correctement formatées et valide sans retour à la ligne personnages.

Je sais que ce n'est pas la meilleure solution, mais cela fonctionne, et très bientôt nous migrerons vers un vrai langage de balisage (tel que Markdown).

+0

J'ai voté pour les autres réponses qui ont été utiles, mais j'ai décidé d'accepter ma propre réponse, car c'était ma véritable solution à ce problème particulier. –

2

Vous avez besoin d'une bibliothèque qui analyserait correctement tout le HTML que vous y jetez, vous ne savez jamais ce que les utilisateurs peuvent inventer.

Regardez HTML Purifier

3

Hmmm, pourquoi vous utilisez des outils de mise en forme HTML quand il pas prévu à cet effet, obtenir votre auto une bibliothèque DOM.

http://simplehtmldom.sourceforge.net/

+0

Ce n'est pas du HTML valide que j'analyse, c'est du texte qui peut contenir du HTML. Ainsi, les parties qui sont HTML doivent être valides, mais le reste n'est que du texte. –

+0

Alors avez-vous le contenu original sans les balises '
' implémentées? si c'est le cas, placez-le dans l'analyseur DOM, la boucle jette chaque élément et place les attributs dans une nouvelle balise fraîche, qui sera ensuite formatée. – RobertPitt

+0

Je ne suis pas sûr de suivre.Si je place du texte dans l'analyseur DOM, je perdrai toutes les nouvelles lignes qui doivent être converties en '
' tags droit? –

0

Idéalement, vous devez utiliser un analyseur XML, par DOM ou SAX API. Cependant, si votre contenu n'est pas du bon XML, mais du texte clair avec quelques balises, l'analyseur peut échouer (cela dépend de l'outil utilisé, je suppose).

Une solution approximative pour votre problème particulier peut être la suivante: construire une machine d'état avec deux états, à l'intérieur d'une étiquette et à l'extérieur d'une étiquette. Vous lisez le caractère d'entrée par caractère. En lisant '<', passez à l'état "intérieur". En lisant '>', passez à l'état "extérieur". En lisant '\ n' et si dans l'état "extérieur", émettre "< br/>" (sinon n'émettre rien).

Ceci est juste un croquis, et il peut avoir besoin d'être affiné.