2008-09-04 11 views
26

J'essaie d'écrire une expression régulière pour enlever tout le HTML à l'exception des liens (les balises <a href et </a> respectivement.) Il ne doit pas nécessairement être 100% sécurisé (je ne m'inquiète pas de l'injection attaques ou quoi que ce soit que je suis content d'analyse syntaxique qui a déjà été approuvé et publié dans un film SWF).Supprimer toutes les balises HTML à l'exception des liens

Les « balises strip » originales d'expression régulière que je utilise étais <(.|\n)+?>, et j'ai essayé de le modifier à <([^a]|\n)+?>, mais cela permettra bien sûr toute étiquette qui a un un dans celui-ci plutôt que celui qui l'a au début, avec un espace

Ce n'est pas vraiment important, mais au cas où quelqu'un aimerait savoir que j'écris ceci dans ActionScript 3.0 pour un film Flash.

Répondre

26
<(?!\/?a(?=>|\s.*>))\/?.*?> 

Essayez ceci. Avait quelque chose de similaire pour les tags p. Travaillé pour eux alors ne vois pas pourquoi pas. Utilise lookahead négatif pour vérifier qu'il ne correspond pas à un (préfixé avec un caractère/facultatif) où (en utilisant positive lookahead) a (avec facultatif/prefix) est suivi par un> ou un espace, stuff, puis>. Cela correspond alors au caractère suivant. Mettez cela dans un avec Subst

s/<(?!\/?a(?=>|\s.*>))\/?.*?>//g; 

Cela devrait laisser que l'ouverture et la fermeture d'une des balises

+0

Cela ne fonctionne pas pour moi avec 'sed' ... – Geremia

1

Je continue sur ce sujet, mais il n'y a aucun moyen que je peux recommander regexr trop souvent. C'est fantastique pour tester ce genre de choses.

1

En général, cette approche présente des problèmes. Les expressions régulières sont préférables pour les correspondances de texte 'plates' - les données imbriquées poussent les moteurs regex dans des zones pour lesquelles ils ne sont pas conçus. L'analyse syntaxique HTML générale nécessite un analyseur syntaxique et non un moteur regex (Google pour la différence entre les langages réguliers et les langages sans contexte si vous souhaitez obtenir tous les détails techniques).

Il est facile de dépouiller tous les tags en remplaçant/</et/>/avec la chaîne vide ou leurs équivalents entité mais filtrer sélectivement HTML en utilisant des expressions rationnelles sera vulnérable à un large éventail d'entrées accidentelles ou malveillantes rupture des choses.

0

Ici, vous allez:

{<(?!i|b|h[1-6]|/i|/b|/h[1-6][\s|>|/])[^>]*>} 
-2

strip_tags() fait cela.

Ici, je comprend tous les <a><p><font><b><i><sup> balises et sortir une version tondu:

cat input.htm | tr -d '\n' | php -r '$input=fgets(STDIN); echo strip_tags($input,"<a><p><font><b><i><sup>");' | tidy -i -wrap 0 -o output.htm 
Questions connexes