Question

J'essaie d'écrire une expression régulière pour supprimer tout le code HTML à l'exception des liens (le <a href et </a> balises respectivement.Il n'est pas nécessaire qu'il soit sécurisé à 100 % (je ne m'inquiète pas des attaques par injection ou quoi que ce soit car j'analyse du contenu qui a déjà été approuvé et publié dans un SWF film).

L'expression régulière originale "strip tags" que j'utilise était <(.|\n)+?>, et j'ai essayé de le modifier en <([^a]|\n)+?>, mais cela permettra bien sûr à toute balise ayant un un dedans plutôt que celui qui l'a au début, avec un espace.

Non pas que cela soit vraiment important, mais au cas où quelqu'un voudrait le savoir, j'écris ceci dans ActionScript 3.0 pour un Éclair film.

Était-ce utile?

La solution

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

Essaye ça.Il y avait quelque chose de similaire pour les balises p.J'ai travaillé pour eux, alors je ne vois pas pourquoi.Utilise une anticipation négative pour vérifier qu'il ne correspond pas à un (préfixé par un caractère / facultatif) où (en utilisant une anticipation positive) un (avec un préfixe / facultatif) est suivi d'un > ou d'un espace, puis de >.Cela correspond ensuite jusqu'au caractère > suivant.Mettez ceci dans un subst avec

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

Cela ne devrait laisser que l'ouverture et la fermeture d'une balise

Autres conseils

Je n'arrête pas d'en parler, mais je ne peux pas le recommander expression régulière trop souvent.C'est fantastique pour tester ce genre de choses.

En général, cette approche pose des problèmes.Les expressions régulières sont les meilleures pour les correspondances de texte « plates » : les données imbriquées poussent les moteurs d'expressions régulières dans des zones pour lesquelles ils ne sont pas conçus.L'analyse HTML générale nécessite un analyseur et non un moteur d'expression régulière (Google pour la différence entre les langages normaux et sans contexte si vous souhaitez connaître tous les détails techniques).

Il est facile de supprimer toutes les balises en remplaçant // et />/ par la chaîne vide ou leurs équivalents d'entité, mais le filtrage sélectif du HTML à l'aide d'expressions régulières sera vulnérable à un large éventail d'entrées accidentelles ou malveillantes qui cassent les choses.

Voici:

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

Que diriez-vous

<[^a](.|\n)+?>

?

strip_tags() est ce que ca.

Ici, j'inclus tous <a><p><font><b><i><sup> balises et sortie d’une version ordonnée :

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top