È “>” (U+003E SEGNO DI MAGGIORE) è consentito all'interno di un elemento html valore dell'attributo?

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

  •  01-07-2019
  •  | 
  •  

Domanda

In altre parole si può utilizzare /<tag[^>]*>.*?<\/tag>/ regex per trovare l' tag elemento html che non contengono nidificati tag elementi?

Per esempio (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 screen-scraper:

#!/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

Entrambi danno lo stesso risultato:

1
">2

Uscita prevista:

1
2

w3c dice:

I valori degli attributi sono una miscela di testo e riferimenti di carattere, tranne che con l'ulteriore restrizione che il il testo non può contenere un ambiguo e commerciale.

È stato utile?

Soluzione

Sì, è consentita (W3C Validator accetta, solo un avvertimento).

Escape < e > sono ammessi all'interno dei commenti, in modo tale semplice espressione regolare può essere preso in giro.

Se Coherence non gestire questo, potrebbe essere un bug o forse una scelta di design per renderlo più resistente di chiusura mancante preventivi di attributi.

Altri suggerimenti

Credo che la validità e il validatore del W3C è d'accordo, ma una fonte autorevole per questo l'informazione è la ISO 8879:1986 standard, che costi ~150EUR/210USD.Indipendentemente da ciò, non è sbagliato per codificarli, così in caso di dubbio, la codifica.Inoltre, se si utilizza un XML-based tipo di documento, è necessario codificare il maggiore-i simboli in sequenza ]]>.

Letterale > è legale ovunque nel contenuto html, sia all'interno dei valori di attributo e come testo all'interno di un elemento.

Dopo aver letto la seguente:

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

sembra entità sfugge vengono suggeriti ovunque (anche in attributi) < > e &

Se ti ostini a usare le espressioni regolari (che è appropriato per la stringa di base operazioni) provare a utilizzare <tag((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)>.*?<\/tag>.Dovrebbe corrispondere gli attributi di perfezione e quindi, che consente di accedere al contenuto interno (anche se non è necessario metterlo in una cattura di gruppo).

Si può anche utilizzare il Html Agilità Pack per l'analisi di HTML, che mi sento di raccomandare, se avete intenzione di fare un sacco di analisi.Mantenimento di grandi espressioni regolari possono facilmente diventare un mal di testa, ma nel frattempo sono anche molto più efficace se si è in grado di farlo.

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

Non corrisponde ad un singolo tag, ma la corrispondenza con la prima start-tag e l'ultimo fine tag per un determinato tag.Proprio come il vostro non e ' un avido tag match, in-tra, dovrebbe essere scritto non avidi pure.

vedere se si ottiene lo stesso risultato usando >invece di >

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top