by Anonymous » 09 Apr 2025, 01:32
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?>
Obligatorische Aussage: Ich weiß, dass Parsing html mit einem Regex nicht zulagbar/unmöglich ist. Mein Problem ist anders: [url=viewtopic.php?t=14917]Ich möchte[/url] 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]/\/]*)(=\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)
}'
[/code]
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]/]*(>|$)|]*)(\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)
}'
[/code]
Drucke (Tag) 0 (Tag) 1 & amp (Tag) 2 < -> & E Link 3 (Tag) , was die erwartete Ausgabe ist.[code]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)
}'
[/code]
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]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)
}'
[/code]
Drucke (Tag) 1 (Tag) 3 (Tag) 4 (Tag) "> 5 anstelle der korrekten Ausgabe (Tag) 0 (Tag)"> 1 (Tag) 2 (Tag) 3 (Tag) 5 . Orte?>