Maison >développement back-end >Golang >Golang html.Parse réécrit la chaîne de requête href pour contenir &

Golang html.Parse réécrit la chaîne de requête href pour contenir &

王林
王林avant
2024-02-09 23:42:081216parcourir

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

L'éditeur PHP Zimo est là pour vous présenter une petite astuce sur Golang. Lors de l'analyse HTML à l'aide de html.Parse, nous devons parfois réécrire la chaîne de requête de href pour inclure le symbole &. Cette technique peut nous aider à être plus flexibles et plus pratiques lors du traitement des liens HTML et à améliorer l'efficacité du développement. Ensuite, nous expliquerons en détail comment utiliser cette technique et donnerons un exemple de code, en espérant qu'il sera utile à tout le monde.

Contenu de la question

J'ai le code suivant :

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)
}
La fonction

html.render produit le résultat suivant :

<!DOCTYPE html><html><head>

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

</body></html>

Pourquoi réécrire la chaîne de requête et mettre & 转换为 & (entre bar et baz) ?

Existe-t-il un moyen d'éviter ce comportement ?

J'essaie de faire une conversion de modèle mais je ne veux pas que cela casse mes URL.

Solution

html.parse 想要生成有效的 html,并且 html 规范规定 href L'esperluette dans l'attribut doit être codée.

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

En sgml et xml, l'esperluette ("&") déclare le début d'une référence d'entité (par exemple, ® représente le symbole de marque déposée "®"). Malheureusement, de nombreux agents utilisateurs HTML ignorent silencieusement l'utilisation incorrecte du symbole & dans les documents HTML - traitant un symbole & qui ne ressemble pas à une référence d'entité comme un symbole & littéral. Les agents utilisateurs basés sur XML ne toléreront pas cette utilisation incorrecte, et tout document utilisant incorrectement le symbole & ne sera pas « valide » et ne sera donc pas conforme à cette spécification. Pour garantir que le document est compatible avec les agents utilisateurs HTML historiques et les agents utilisateurs basés sur XML, le symbole & utilisé dans le document, qui est traité comme un caractère littéral, doit se représenter comme une référence d'entité (telle que "&"). Par exemple, lorsque l'attribut href de l'élément a fait référence à un script cgi avec des paramètres, il doit être exprimé comme http://my.site.dom/cgi-bin/myscript.pl?class=guest& name=user 而不是 http://my.site.dom/cgi-bin/myscript.pl?class=guest&name=user.

Dans ce cas, go rend votre HTML meilleur et plus efficace

Cela étant dit - le navigateur y échappera, donc si vous cliquez dessus, l'URL résultante sera toujours correcte (sans le &,只有 & :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer