Ai-je vraiment besoin de coder '&''&'?

j'utilise le symbole & avec HTML5 et UTF-8 dans mon site <title> . Google montre l'ampersand fine sur ses SERPs, comme le font tous les navigateurs dans leurs titres.

http://validator.w3.org me donne ceci:

& n'a pas commencé une référence de caractère. (&aurait probablement dû s'échapper sous le nom de &amp; .)

ai-je vraiment besoin de le faire &amp; ?

Je ne suis pas préoccupé par mes pages validant pour le plaisir de valider, mais je suis curieux d'entendre les opinions des gens sur ceci et si c'est important et pourquoi.

176
demandé sur Richard J. Ross III 2010-08-16 17:09:49
la source

17 ответов

Oui. Comme le dit l'erreur, en HTML, les attributs sont #PCDATA ce qui signifie qu'ils sont analysés. Cela signifie que vous pouvez utiliser des entités de caractères dans les attributs. Utiliser & par lui-même est erroné et si ce n'est pas pour les navigateurs indulgents et le fait que ce soit HTML pas XHTML, briserait l'analyse. Il suffit d'y échapper comme &amp; et tout serait très bien.

HTML5 vous permet de le laisser sans enregistrement, mais seulement lorsque les données qui suivent ne ressemble pas à un valide référence de caractère. Cependant, il est préférable d'échapper à toutes les instances de ce symbole que de se soucier de ceux qui devraient être et ceux qui n'ont pas besoin d'être.

gardez ce point à l'esprit; si vous ne fuyez pas & to &, c'est assez mauvais pour les données que vous créez (où le code pourrait très bien être invalide), vous pourriez aussi ne pas échapper aux délimiteurs d'étiquette, ce qui est un énorme problème pour les données soumises par l'utilisateur, ce qui pourrait très bien conduire à HTML et l'injection de script, le vol de cookie et d'autres exploits.

veuillez juste échapper à votre code. Il vous permettra d'économiser beaucoup d'ennuis dans l'avenir.

127
répondu Delan Azabani 2010-08-17 03:21:46
la source

mise à part la Validation, il n'en demeure pas moins que l'encodage de certains caractères est important pour un document HTML afin qu'il puisse rendre correctement et en toute sécurité une page web.

Encodage & comme &amp; dans tous les cas, pour moi, c'est plus facile une règle de vie, la réduction de la probabilité d'erreurs et d'échecs.

comparez ce qui suit: qu'est-ce qui est le plus facile? qu'est-ce qui est le plus facile pour bousiller ?

Méthodologie 1

  1. écrivez un contenu qui inclut des caractères d'ampli.
  2. encodez - les tous.

Méthodologie 2

(avec un grain de sel, s'il vous plaît ;) )

  1. écrivez un contenu qui inclut un caractère d'ampli.
  2. au cas par cas, regardez chaque ampère. Déterminer si:
    • il est isolé, et en tant que tel sans ambiguïté un ampersand. par exemple. volt & amp

      > dans ce cas, ne vous donnez pas la peine de l'encoder.
    • il n'est pas isolé, mais vous sentez qu'il est néanmoins sans ambiguïté, car l'entité résultante n'existe pas et n'existera jamais puisque la liste des entités ne pourrait jamais évoluer. eg amp&volt

      > dans ce cas, ne vous donnez pas la peine de l'encoder.
    • Il n'est pas isolé, et ambiguës. par exemple. volt&amp

      > encodez-le.

??

51
répondu Richard JP Le Guen 2013-10-10 01:14:51
la source

j'ai fait des recherches approfondies et j'ai écrit au sujet de mes conclusions ici: http://mathiasbynens.be/notes/ambiguous-ampersands

j'ai aussi créé un outil en ligne que vous pouvez utiliser pour vérifier votre balisage pour les ampersands ambigus ou les références de caractères qui ne se terminent pas par un point-virgule, Les deux sont invalides. (Aucun validateur HTML ne le fait correctement.)

http://i.imgur.com/cLssU.png

29
répondu Mathias Bynens 2012-02-06 18:10:44
la source
Les règles

HTML5 sont différentes de HTML4. Ce n'est pas nécessaire dans HTML5 - à moins que l'ampli ne ressemble à un nom de paramètre. "©=2 " est encore un problème, par exemple, puisque © est le symbole du droit d'auteur.

cependant il me semble qu'il est plus difficile de décider de coder ou non selon le texte suivant. Donc le plus simple est probablement d'encoder tous les temps.

18
répondu Matthew Wilson 2010-08-16 17:42:05
la source

je pense que cela s'est transformé en plus d'une question de" pourquoi suivre les spécifications lorsque le navigateur ne se soucie pas."Voici ma réponse généralisée:

Les normes

ne sont pas une chose "présente". Ils sont une chose du "futur". Si nous, en tant que développeurs, suivons les normes web, alors les fournisseurs de navigateur sont plus susceptibles de mettre en œuvre correctement ces normes, et nous nous rapprochons d'un web complètement interopérable, où les hacks CSS, la détection de fonctionnalités, et la détection de navigateur ne sont pas nécessaires. Où nous n'avez pas à comprendre pourquoi nos mises en pause dans un navigateur particulier, ou comment travailler autour de cela.

spécifiquement, si HTML5 ne nécessite pas d'utiliser & dans votre situation spécifique, et que vous utilisez un doctype HTML5 (et que vous vous attendez également à ce que vos utilisateurs utilisent des navigateurs conformes à HTML5), alors il n'y a aucune raison de le faire.

13
répondu Ryan Kinal 2010-08-16 18:32:56
la source

Eh bien, si elle vient de l'entrée de l'utilisateur alors Absolument oui, pour des raisons évidentes. Pense que si ce site n'est pas: le titre de cette question apparaîtra comme ai-je vraiment besoin de coder‘&’‘&’?

si c'est juste quelque chose comme echo '<title>Dolce & Gabbana</title>'; alors à proprement parler vous n'avez pas à. Il serait mieux, mais si vous n'avez pas aucun utilisateur ne remarquera la différence.

5
répondu Andreas Bonini 2010-08-16 17:11:32
la source

pouvez-vous nous montrer ce qu'est votre title ? Quand je soumets

<!DOCTYPE html>
<html>
<title>Dolce & Gabbana</title>
<body>
<p>am i allowed loose & mpersands?</p>
</body>
</html>

à http://validator.w3.org / - lui demandant explicitement d'utiliser le mode expérimental HTML 5 - il n'a aucune plainte au sujet du & S...

5
répondu AakashM 2010-08-16 18:12:43
la source

si l'utilisateur vous le passe, ou s'il se retrouve dans une URL, vous devez l'échapper.

si elle apparaît en texte statique sur une page? Tous les navigateurs obtiendront ce droit de toute façon, vous ne vous inquiétez pas beaucoup à ce sujet, car il fonctionnera.

3
répondu Dean J 2010-08-16 17:42:45
la source

HTML & marque le début d'une référence, d'un référence de caractère ou d'un entité de référence . À partir de ce point, l'analyseur prévoit soit un # indiquant une référence de caractère, soit un nom d'entité indiquant une référence d'entité, tous deux suivis d'un ; . C'est le comportement normal.

mais si le nom de référence ou simplement l'ouverture de référence & est suivi d'un espace blanc ou d'autres délimiteurs comme " , ' , < , > , & , la fin ; et même une référence pour représenter un & peut être omise:

<p title="&amp;">foo &amp; bar</p>
<p title="&amp">foo &amp bar</p>
<p title="&">foo & bar</p>

ce N'est que dans ces cas que la fin ; ou même la référence elle-même peut être omise (au moins en HTML 4). Je pense que HTML 5 nécessite la fin ; .

mais la spécification recommande d'utiliser toujours une référence comme la référence de caractère &#38; ou la référence d'entité &amp; pour éviter toute confusion:

les auteurs doivent utiliser" &amp; "(ASCII decimal 38) au lieu de" & " pour éviter toute confusion avec le début d'une référence de caractère (entité référence délimiteur ouvert). Les auteurs doivent également utiliser " &amp; " dans les valeurs d'attribut car les références de caractères sont autorisées dans CDATA. les valeurs d'attribut.

3
répondu Gumbo 2010-08-16 18:22:36
la source

Oui, vous devriez essayer de servir le code est valide, si possible.

la plupart des navigateurs corrigeront cette erreur en silence, mais il y a un problème avec le traitement des erreurs dans les navigateurs. Il n'y a pas de norme sur la façon de traiter le code incorrect, c'est donc à chaque fournisseur de navigateur d'essayer de comprendre ce qu'il faut faire avec chaque erreur, et les résultats peuvent varier.

quelques exemples où les navigateurs sont susceptibles de réagir différemment est si vous mettez des éléments à l'intérieur une table mais à l'extérieur des cellules de la table, ou si vous nichez des liens à l'intérieur de l'autre.

pour votre exemple spécifique, il est peu probable de causer des problèmes, mais la correction d'erreur dans le navigateur pourrait par exemple amener le navigateur à passer du mode conforme aux normes en mode quirks, ce qui pourrait faire votre mise en page complètement tomber en panne.

donc, vous devriez corriger des erreurs comme celle-ci dans le code, si ce n'est pour rien d'autre donc pour garder la liste des erreurs dans le validateur court, de sorte que vous pouvez repérer les problèmes plus graves.

2
répondu Guffa 2010-08-16 17:19:53
la source

il y a quelques années, on nous a signalé qu'une de nos applications web ne s'affichait pas correctement dans Firefox. Il s'est avéré que la page contenait une étiquette qui ressemblait à

<div style="..." ... style="...">

face à un attribut de style répété, IE combine les deux styles, tandis que Firefox n'en utilise qu'un, d'où le comportement différent. J'ai changé l'étiquette en

<div style="...; ..." ...>

et bien sûr, il a corrigé le problème! La morale de l'histoire est que les navigateurs ont un traitement plus uniforme du HTML valide que du HTML invalide. Alors, répare ton putain de markup! (Ou utilisez HTML Tidy pour le corriger.)

2
répondu dan04 2010-08-20 04:09:28
la source

je vérifiais pourquoi L'URL de L'Image doit s'échapper, donc je l'ai essayé dans https://validator.w3.org . L'explication est assez agréable. Il souligne que même URL doit être échappé. [PS: je suppose qu'il ne sera pas enregistré quand il est consommé depuis le besoin D'URL & . Quelqu'un peut clarifier?]

<img alt="" src="foo?bar=qut&qux=fop" />

une référence à une entité a été trouvée dans le document, mais il n'y a pas référence de ce nom défini. Souvent, cela est causé par orthographe le nom de référence, clair et commercial, ou en laissant le de fuite point-virgule (;). La cause la plus commune de cette erreur est ampersands libres dans les URLs comme décrit par le WDG dans " Ampersands in URL." Les références d'Entity commencent par une ampersand (&) et se terminent par une virgule.);( Si vous souhaitez utiliser un littéral esperluette dans votre document vous devez encoder comme "&" (même à l'intérieur d'Url!). Attention à la fin les références d'entité avec un point-virgule ou votre référence d'entité peut obtenir interprétées en relation avec le texte suivant. Aussi garder à l'esprit que les références d'entité nommées sont sensibles à la casse; &Aelig; et æ sont des personnages différents. Si cette erreur apparaît dans certains de balisage généré par le code de gestion de session de PHP, cet article a des explications et des solutions à votre problème.

2
répondu Nishant 2016-04-20 08:44:15
la source

si & est utilisé dans html alors vous devriez y échapper

si & est utilisé dans les chaînes javascript, p.ex. un alert('This & that'); ou un document.href vous n'avez pas besoin de l'utiliser.

si vous utilisez document.Ecrivez alors vous devriez l'utiliser par exemple document.write(<p>this &amp; that</p>)

1
répondu Alex 2010-08-16 17:49:32
la source

cela dépend de la probabilité qu'un point-virgule se termine près de votre & , ce qui le fait afficher quelque chose de très différent.

par exemple, lorsque vous traitez avec les entrées des utilisateurs (par exemple, si vous incluez le sujet fourni par l'utilisateur d'un forum dans vos balises de titre), vous ne savez jamais où ils pourraient mettre des points-virgule aléatoires, et il pourrait au hasard Afficher des entités étranges. Donc toujours s'échapper dans cette situation.

pour votre propre html, bien sûr, vous pouvez le sauter, mais il est tellement trivial d'inclure l'évasion appropriée, qu'il n'y a aucune bonne raison de l'éviter.

1
répondu Douglas 2016-11-03 05:00:23
la source

Si vous êtes vraiment parler du texte statique

<title>Foo & Bar</title>

stockées dans un fichier sur le disque dur et servis directement par un serveur, alors oui: il n'a probablement pas besoin d'être échappé.

cependant, puisqu'il y a très petit contenu HTML de nos jours qui est complètement statique, je vais ajouter le disclaimer suivant qui suppose que le contenu HTML est généré à partir d'une autre source (contenu de la base de données, entrée de l'utilisateur, résultat de l'appel du service web, résultat de L'API legacy, ...):

si vous n'échappez pas à un simple & , il y a de fortes chances que vous n'échappiez pas non plus à un &amp; ou à un &nbsp; ou à un <b> ou à un <script src="http://attacker.com/evil.js"> ou à tout autre texte non valide. Cela signifierait que vous affichez au mieux votre contenu à tort et sont plus susceptibles d'être suspectables à attaques XSS .

en d'autres termes: quand vous êtes déjà vérifier et échapper aux autres cas plus problématiques, alors il n'y a presque aucune raison de laisser le pas-totalement-cassé-mais-encore-un peu-poisseux autonome-& sans escapade.

0
répondu Joachim Sauer 2010-08-16 19:37:23
la source

Je ne suis pas sûr que cela soit utile à qui que ce soit... Je me battais depuis un certain temps... voici un regex glorieux que vous pouvez utiliser pour corriger tous vos liens, javascript, le contenu. J'ai eu à traiter avec une tonne de contenu hérité que personne ne voulait corriger.

ajoutez ceci à votre paramètre de rendu dans votre page maître ou contrôle:

Merci de ne pas la flamme moi pour la mise au mauvais endroit:

// remove the & from href="blaw?a=b&b=c" and replace with &amp; 
//in urls - this corrects any unencoded & not just those in URL's
// this match will also ignore any matches it finds within <script> blocks AND
// it will also ignore the matches where the link includes a javascript command like
// <a href="javascript:alert{'& & &'}">blaw</a>
html = Regex.Replace(html, "&(?!(?<=(?<outerquote>[\"'])javascript:(?>(?!\k<outerquote>|[>]).)*)\k<outerquote>?)(?!(?:[a-zA-Z][a-zA-Z0-9]*|#\d+);)(?!(?>(?:(?!<script|\/script>).)*)\/script>)", "&amp;", RegexOptions.Singleline | RegexOptions.IgnoreCase);
-1
répondu Richard Dufour 2014-07-10 22:47:54
la source

Le lien a un assez bon exemple de quand et pourquoi vous pourriez avoir besoin pour s'enfuir & à &amp;

https://jsfiddle.net/vh2h7usk/1 /

fait Intéressant, j'ai dû fuir le personnage afin de représenter correctement dans ma réponse ici. Si j'utilise l'option intégrée exemple de code (du panneau de réponse), je peux simplement taper &amp; et il apparaît comme il se doit. Mais si j'utilise manuellement l'élément <code></code> , alors je dois m'échapper pour le représenter correctement :)

-1
répondu mathin 2017-04-24 13:56:28
la source