“>” (U+003e signo maior do que) é permitido dentro de um valor de atributo de elemento HTML?

StackOverflow https://stackoverflow.com/questions/94528

  •  01-07-2019
  •  | 
  •  

Pergunta

Em outras palavras, pode -se usar /<tag[^>]*>.*?<\/tag>/ regex para corresponder ao tag elemento html que não contém aninhados tag elementos?

Por exemplo (Lt.html):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <title>greater than sign in attribute value</title>
  </head>
  <body>
    <div>1</div>
    <div title=">">2</div>
  </body>
</html>

Regex:

$ perl -nE"say $1 if m~<div[^>]*>(.*?)</div>~" lt.html

E raspador de tela:

#!/usr/bin/env python
import sys
import BeautifulSoup

soup = BeautifulSoup.BeautifulSoup(sys.stdin)
for div in soup.findAll('div'):
    print div.string


$ python lt.py <lt.html

Ambos dão a mesma saída:

1
">2

Saída esperada:

1
2

W3C diz:

Os valores de atributo são uma mistura de referências de texto e caracteres, exceto com a restrição adicional de que o texto não pode conter um ampersa e ambígua.

Foi útil?

Solução

Sim, é permitido (o validador W3C aceita, emite apenas um aviso).

Não especificado < e > Também são permitidos comentários internos, portanto, o regexp tão simples pode ser enganado.

Se o BeautifulSoup não lidar com isso, pode ser um bug ou talvez uma decisão de design consciente para torná -lo mais resiliente a perder as cotações de fechamento em atributos.

Outras dicas

Acredito que isso é válido e o validador W3C concorda, mas a fonte autorizada para essas informações é o padrão ISO 8879: 1986, que custa ~ 150EUR/210USD. Independentemente disso, não é errado codificá -los; portanto, em caso de dúvida, codifique. Além disso, se você estiver usando um tipo de documento baseado em XML, precisará codificar sinais maiores do que ]]>.

Literal > é legal em todos os lugares do conteúdo HTML, tanto os valores de atributo interno quanto como texto em um elemento.

Depois de ler o seguinte:

http://www.w3.org/international/questions/qa-escapes

Parece que as escapadas de entidade são sugeridas em todos os lugares (inclusive em atributos) para <> e & &

Se você insistir em usar expressões regulares (o que é apropriado para operações básicas de string), tente usar <tag((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)>.*?<\/tag>. Ele deve corresponder aos atributos perfeitamente e, portanto, permitir que você acesse o conteúdo interno (embora você precise colocá -lo em um grupo de captura).

Você também pode usar o HTML Agility Pack Para analisar o HTML, que eu recomendaria se você fizesse muita análise. Manter grandes expressões regulares pode se tornar facilmente uma dor de cabeça, mas, enquanto isso, eles também são muito mais eficazes se você puder fazê -lo.

yeah except /<tag[^>]*>.*?<\/tag>/

Não corresponderá a uma única tag, mas corresponde à primeira partida e a última marcha final para uma determinada tag. Assim como seu primeiro tag-match não-greedoso, seu intermediário também deve ser escrito sem graça.

Veja se você obtém o mesmo resultado usando> em vez de>

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top