Ein POSIX-erweiterter Regex, der alle HTML-Tags (Start/Selbstklassen/Ende) aller void oder normalen Elemente entsprichtHTML

HTML-Programmierer
Anonymous
 Ein POSIX-erweiterter Regex, der alle HTML-Tags (Start/Selbstklassen/Ende) aller void oder normalen Elemente entspricht

Post by Anonymous »

Obligatorische Aussage: Ich weiß, dass Parsing html mit einem Regex nicht zulagbar/unmöglich ist. Mein Problem ist anders: Ich möchte nur eine Regex, die alle Tags aus einer sehr begrenzten -Subset von HTML finden kann. Dies ist also eine vereinfachte Tokenisierung, die nicht analysiert wird. , , Elemente usw.).

Code: Select all

/\/]*)(=\s*("[^"]*"|\047[^\047]*\047|[^[:space:]>]+)|[^>])*(>|$)/
< /code>
, aber es löst das Problem nicht, wenn Tags beliebige Fehler enthalten können. Zum Beispiel < /p>
echo '135' | LC_ALL=en_US.utf8 gawk 'BEGIN {IGNORECASE = 1}
{
s = gensub(/\/]*)(=\s*("[^"]*"|\047[^\047]*\047|[^[:space:]>]+)|[^>])*(>|$)/, "(tag)", "g", $0);
print(s)
}'
Drucke (Tag) 1 (Tag) 3 (Tag) 5 anstelle der korrekten Ausgabe (Tag) 0 (Tag) "> 1 (Tag) 2 (Tag)"> 3 (Tag) 4 (Tag) "> 5 5 . Versuchte die folgende Regex (Fall-unempfindlich): < /p>

Code: Select all

/]*(>|$)|]*)(\s+[^[:space:]\/>]+\s*=\s*("[^"]*"|\047[^\047]*\047|[^[:space:]>]+)|[^>])*(>|$)/
< /code>
Es gibt die richtigen Ergebnisse für fast alle Eingänge aus, die in der Praxis auftreten können, einschließlich Eingaben mit Fehlern. Zum Beispiel die Eingabe aus dieser Antwort: < /p>
echo '0&e link 3' | LC_ALL=en_US.utf8 gawk 'BEGIN {IGNORECASE = 1}
{
s = gensub(/]*(>|$)|]*)(\s+[^[:space:]\/>]+\s*=\s*("[^"]*"|\047[^\047]*\047|[^[:space:]>]+)|[^>])*(>|$)/, "(tag)", "g", $0);
print(s)
}'
Drucke (Tag) 0 (Tag) 1 & amp (Tag) 2 < -> & E Link 3 (Tag) , was die erwartete Ausgabe ist.

Code: Select all

echo '23' | LC_ALL=en_US.utf8 gawk 'BEGIN {IGNORECASE = 1}
{
s = gensub(/]*(>|$)|]*)(\s+[^[:space:]\/>]+\s*=\s*("[^"]*"|\047[^\047]*\047|[^[:space:]>]+)|[^>])*(>|$)/, "(tag)", "g", $0);
print(s)
}'
Drucke (Tag) 2 (Tag) 3 , was die erwartete Ausgabe ist. In einigen Fällen ist jedoch falsche Übereinstimmungen, da es die Logik nicht richtig codiert: nämlich kann die Rolle von U+003D Equals Sign nicht korrekt bestimmen, d. H. Ob = gehört zu Attributnamen (verbunden oder nicht verbunden mit Attributwert) oder verbindet den Attributnamen mit Attributname oder gehört zu den Wertmordnamen. Zum Beispiel < /p>

Code: Select all

echo '135' | LC_ALL=en_US.utf8 gawk 'BEGIN {IGNORECASE = 1}
{
s = gensub(/]*(>|$)|]*)(\s+[^[:space:]\/>]+\s*=\s*("[^"]*"|\047[^\047]*\047|[^[:space:]>]+)|[^>])*(>|$)/, "(tag)", "g", $0);
print(s)
}'
Drucke (Tag) 1 (Tag) 3 (Tag) 4 (Tag) "> 5 anstelle der korrekten Ausgabe (Tag) 0 (Tag)"> 1 (Tag) 2 (Tag) 3 (Tag) 5 . Orte?>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post