Heim  >  Artikel  >  Backend-Entwicklung  >  Golang html.Parse schreibt die href-Abfragezeichenfolge so um, dass sie & enthält

Golang html.Parse schreibt die href-Abfragezeichenfolge so um, dass sie & enthält

王林
王林nach vorne
2024-02-09 23:42:081158Durchsuche

Golang html.Parse重写href查询字符串以包含&

PHP-Redakteur Zimo ist hier, um Ihnen einen kleinen Trick über Golang vorzustellen. Beim Parsen von HTML mit html.Parse müssen wir manchmal die Abfragezeichenfolge von href umschreiben, um das &-Symbol einzuschließen. Diese Technik kann uns helfen, bei der Verarbeitung von HTML-Links flexibler und komfortabler zu sein und die Entwicklungseffizienz zu verbessern. Als nächstes erklären wir im Detail, wie diese Technik verwendet wird, und geben Beispielcode, in der Hoffnung, dass er für alle hilfreich ist.

Frageninhalt

Ich habe den folgenden Code:

package main

import (
    "os"
    "strings"

    "golang.org/x/net/html"
)

func main() {
    myhtmldocument := `<!doctype html>
<html>
<head>
</head>
<body>
    <a href="http://www.example.com/input?foo=bar&baz=quux">wtf</a>
</body>
</html>`

    doc, _ := html.parse(strings.newreader(myhtmldocument))
    html.render(os.stdout, doc)
}
Die Funktion

html.render erzeugt die folgende Ausgabe:

<!DOCTYPE html><html><head>

</head>
<body>
    <a href="http://www.example.com/input?foo=bar&baz=quux">WTF</a>

</body></html>

Warum die Abfragezeichenfolge umschreiben und & 转换为 & (zwischen bar und baz) einfügen?

Gibt es eine Möglichkeit, dieses Verhalten zu vermeiden?

Ich versuche eine Vorlagenkonvertierung durchzuführen, möchte aber nicht, dass dadurch meine URLs beschädigt werden.

Lösung

html.parse 想要生成有效的 html,并且 html 规范规定 href Das kaufmännische Und im Attribut muss codiert sein.

https://www.w3.org/tr/xhtml1/guidelines .html#c_12

In SGML und XML deklariert das kaufmännische Und-Zeichen („&“) den Anfang einer Entitätsreferenz (z. B. steht ® für das eingetragene Markensymbol „®“). Leider ignorieren viele HTML-Benutzeragenten stillschweigend die falsche Verwendung des &-Symbols in HTML-Dokumenten und behandeln ein &-Symbol, das nicht wie eine Entitätsreferenz aussieht, als wörtliches &-Symbol. XML-basierte Benutzeragenten tolerieren diese falsche Verwendung nicht und jedes Dokument, das das &-Symbol falsch verwendet, ist nicht „gültig“ und entspricht daher nicht dieser Spezifikation. Um sicherzustellen, dass das Dokument mit historischen HTML-Benutzeragenten und XML-basierten Benutzeragenten kompatibel ist, muss das im Dokument verwendete &-Symbol, das als Literalzeichen behandelt wird, sich selbst als Entitätsreferenz (z. B. „&“) darstellen. Wenn sich beispielsweise das href-Attribut des a-Elements auf ein CGI-Skript mit Parametern bezieht, muss es als http://my.site.dom/cgi-bin/myscript.pl?class=guest& name=user 而不是 http://my.site.dom/cgi-bin/myscript.pl?class=guest&name=user ausgedrückt werden.

In diesem Fall macht Go Ihr HTML tatsächlich besser und effizienter

Davon abgesehen wird der Browser es maskieren. Wenn Sie also darauf klicken, ist die resultierende URL immer noch korrekt (ohne das &,只有 &:

console.log(document.queryselector('a').href)
 <a href="http://www.example.com/input?foo=bar&baz=quux">WTF</a>

Das obige ist der detaillierte Inhalt vonGolang html.Parse schreibt die href-Abfragezeichenfolge so um, dass sie & enthält. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen