Pergunta

Eu estou tentando escrever uma expressão regular para tira todo o HTML, com exceção de links (o <a href e </a> tags respectivamente.Ele não tem que ser 100% segura (não estou preocupado com os ataques de injeção ou qualquer coisa como eu sou de análise de conteúdo que já foi aprovado e publicado em um SWF filme).

O original "strip tags" expressão regular que eu estou usando foi <(.|\n)+?>, e eu tentava modificá-lo para <([^a]|\n)+?>, mas que, naturalmente, vai permitir que qualquer marca que tem um um em vez do que aquela que tem no começo, com um espaço.

Não que isso realmente importa, mas no caso de alguém se preocupa em saber o que eu estou escrevendo isso no O ActionScript 3.0 para um Flash o filme.

Foi útil?

Solução

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

Tente isso.Havia algo semelhante para p tags.Trabalhou para eles, então não vejo por que não.Utiliza negativo lookahead para verificar que ele não corresponder a um (prefixo opcional com um caractere"/"), onde (usando positivo lookahead) um (com opcional / prefixo) é seguido por uma > ou um espaço, material e, em seguida,>.Isso corresponde, em seguida, até o próximo caractere>.Colocar isso em uma subst

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

Isso deve deixar apenas a abertura e o fechamento de tags

Outras dicas

Eu continuo indo sobre ele, mas não há nenhuma maneira que eu posso recomendar regexr muitas vezes.É fantástico para testar este tipo de coisas.

Em geral há problemas com esta abordagem.Regexes são os melhores para o 'plano' de texto corresponde a - dados aninhadas empurra regex motores em áreas para as quais eles não são projetados.Geral análise de HTML precisa de um analisador não um mecanismo de regex (Google a diferença entre regular e livre de contexto línguas, se você deseja técnico completo para mais detalhes).

É fácil retirar as etiquetas, substituindo o /</ e />/ com uma string vazia ou a sua entidade equivalentes, mas seletivamente a filtragem de HTML usando regexes ser vulnerável a uma ampla gama de acidental ou mal-intencionado entradas de quebrar as coisas.

Aqui você vai:

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

Como sobre

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

?

strip_tags() faz isso.

Aqui, eu estou incluindo todos os <a><p><font><b><i><sup> marcas e enviar um arrumado versão:

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top