Les guillemets simples sont-ils autorisés en HTML?

146

Je suis un grand utilisateur de l'utilisation de guillemets doubles en PHP afin de pouvoir interpoler des variables plutôt que de concaténer des chaînes. En conséquence, lorsque je génère du HTML, j'utilise souvent des guillemets simples pour définir les champs de balise. Par exemple:

$html = "<input type='text' name='address' value='$address'>";

Maintenant c'est beaucoup plus lisible pour moi que non plus

$html = "<input type=\"text\" name=\"address\" value=\"$address\">";

ou

$html = '<input type="text" name="address" values="' . $address . '">' ;

De brèves recherches, j'ai entendu des gens dire que les guillemets simples pour les champs HTML ne sont pas reconnus par TOUS les navigateurs. Ainsi, je me demande quels navigateurs auraient des problèmes pour reconnaître le HTML à guillemet simple?

Courses de légèreté en orbite
la source

Réponses:

149

Ceci est similaire à Quand les guillemets simples en HTML sont-ils devenus si populaires? . Les guillemets simples autour des attributs en HTML sont et ont toujours été autorisés par la spécification . Je ne pense pas qu'aucun navigateur ne les comprendrait.

Greg Hewgill
la source
13
Une chose que je dois mentionner ici est que certains clients HTML (pas les navigateurs nécessaires) ont des problèmes de compatibilité avec les guillemets simples. Un exemple étrange est que dans Hotmail, si vous utilisez <img src='cid:xxx' ... />pour afficher une image en ligne, elle n'apparaîtra pas du tout car l'ID de contenu a été ignoré. Vous devez utiliser `<img src =" cid: xxx "... /> à la place.
Earth Engine
52

Comme l'a noté PhiLho, bien qu'il existe une croyance largement répandue selon laquelle les guillemets simples ne sont pas autorisés pour les valeurs d'attribut, cette croyance est erronée.

La norme XML autorise les guillemets simples et doubles autour des valeurs d'attribut.

La norme XHTML ne dit rien pour changer cela, mais une section connexe qui stipule que les valeurs d'attribut doivent être entre guillemets utilise des guillemets doubles dans l'exemple, ce qui a probablement conduit à cette confusion. Cet exemple montre simplement que les valeurs d'attribut en XHTML doivent répondre à la norme minimale pour les valeurs d'attribut en XML, ce qui signifie qu'elles doivent être entre guillemets (par opposition au HTML simple qui ne se soucie pas), mais ne vous limite pas à un seul ou à double citation.

Bien sûr, il est toujours possible que vous rencontriez un analyseur qui n'est pas conforme aux normes, mais lorsque cela se produit, tous les paris sont de toute façon ouverts. Il est donc préférable de s'en tenir à ce que dit la spécification. C'est pourquoi nous avons des spécifications, après tout.

Adam Bellaire
la source
2
+1 pour le lien vers la norme XML. Je sais que c'est un vieux fil, mais par souci d'exhaustivité, les gens devraient prêter une attention particulière à la spécification de la grammaire AttValue dans la norme. Si vous pouvez lire EBNF (très similaire aux expressions régulières), vous verrez qu'il permet l'utilisation de guillemets simples et doubles pour délimiter les attributs.
daiscog
7
Mais HTML est basé sur SGML (c'est XHTML qui est basé sur XML) donc citer la spécification XML n'est pas très utile…
Donal Fellows
La vraie confusion est de savoir si les guillemets simples ou doubles dans une valeur d'attribut doivent toujours être échappés. Il semble que si vous utilisez des guillemets doubles autour de la valeur d'attribut, vous devez alors échapper des guillemets doubles, mais pas des guillemets simples. Si à la place vous utilisez des guillemets simples autour de la valeur d'attribut, vous devrez alors échapper des guillemets simples, mais pas des guillemets doubles. Et je pense que c'est tout l'intérêt de permettre l'un ou l'autre. Si vous avez beaucoup de guillemets doubles dans votre valeur, vous pouvez éviter de les échapper en utilisant des guillemets simples autour de la valeur entière, et vice versa.
Triynko
Le fait est que si vous utilisez un mode document XHTML, vous rencontrerez des problèmes d'interprétation Javascript où il essaiera de forcer tout HTML créé par Javascript à utiliser des guillemets doubles, en cassant les attributs avec des guillemets doubles non échappés à l'intérieur. J'ai rencontré ce problème dans Firefox ainsi que dans IE il y a plusieurs années.
user2867288
16

J'ai entendu des gens dire que les guillemets simples pour les champs HTML ne sont pas reconnus par TOUS les navigateurs

Cette personne a tort.

FlySwat
la source
30
Pas nécessairement. Je peux créer un navigateur en quelques minutes qui ne reconnaît pas les guillemets simples pour les champs HTML. Bien sûr, il y en aura beaucoup plus qu'il ne reconnaîtra pas ...; P
Courses de légèreté en orbite
@LightnessRacesinOrbit "Que voulez-vous dire que ce navigateur ne prend pas en charge CSS?!"
BadHorsie
... ou plus important encore, "ce navigateur (qui ne le fait pas) est de la viande morte". : P
ToolmakerSteve
@LightnessRacesinOrbit - mais avez-vous? On dirait que toute personne suffisamment motivée pour créer un navigateur entier va mettre 5 minutes supplémentaires pour lui faire accepter les guillemets simples.
user3413723
7

Ne croyez pas tout ce que vous voyez sur Internet ...
Curieusement, je viens de répondre à quelque chose de similaire à quelqu'un déclarant que les guillemets simples ne sont pas valides en XHTML ...

Mmm, je regarde ci-dessus en tapant et je vois qu'Adam N propage la même croyance. S'il peut confirmer son affirmation, je rétracte ce que j'ai écrit ... AFAIK, XML est agnostique et accepte les deux types de citation. J'ai même essayé et validé sans problème une page XHTML avec seulement des guillemets simples.

PhiLho
la source
4

Le seul problème est que les données entrent dans les champs de saisie de texte. Considérer

<input value='it's gonna break'/>

Même avec:

<input value="i say - "this is gonna be trouble" "/>

Vous ne pouvez pas y échapper, vous devez utiliser htmlspecialchars.

inteblio
la source
2
Vous pouvez cependant faire:<input value='it&apos;s gonna break'/>
rink.attendant 6
4
Je pense que la raison pour laquelle nous avons la possibilité d'utiliser des guillemets simples ou doubles est d'éviter d'avoir à échapper des caractères exactement dans ce scénario. Si vous avez seulement des guillemets doubles dans votre valeur, l' entourer avec des guillemets simples pour éviter d' avoir à échapper aux guillemets doubles comme ceci: <input value="it's not gonna break"/>et vice versa: <input value='i say - "this is not gonna be trouble"'/>.
Triynko
1
@Triynko a raison. En outre: Pour le contenu , pensez à ne pas utiliser de «guillemets stupides» en premier lieu, mais des «citations typographiques»: la barre de Peter, pas la barre de Peter. ☞ en.wikipedia.org/wiki/Quotation_mark#Quotation_marks_in_English
Frank Nocke
2

Comme je cherchais à trouver des informations à ce sujet dans une version beaucoup plus récente de la spécification et qu'il m'a fallu un certain temps pour les trouver, la voici:

De

HTML 5.3

Draft Editor, 18 octobre 2018

[...]

8.1.2.3. Les attributs

Syntaxe de la valeur d'attribut entre guillemets simples

Le nom de l'attribut, suivi de zéro ou plusieurs caractères d'espacement, suivi d'un seul caractère U + 003D EQUALS SIGN, suivi de zéro ou plusieurs espaces, suivi d'un seul caractère U + 0027 APOSTROPHE ('), suivi de la valeur d'attribut, qui, en plus des exigences données ci-dessus pour les valeurs d'attribut, ne doit contenir aucun caractère U + 0027 APOSTROPHE littéral ('), et finalement suivi d'un deuxième caractère APOSTROPHE U + 0027 unique (').

Dans l'exemple suivant, l'attribut type est fourni avec la syntaxe de la valeur d'attribut entre guillemets simples:

<input type='checkbox'>

Si un attribut utilisant la syntaxe d'attribut entre guillemets simples doit être suivi d'un autre attribut, il doit y avoir un espace séparant les deux.

http://w3c.github.io/html/single-page.html#elements-attributes

connexo
la source
1

J'ai aussi tendance à utiliser des guillemets simples en HTML et je n'ai jamais rencontré de problème.

UnkwnTech
la source
1

J'ai utilisé des guillemets simples dans les pages HTML et des JavaScripts intégrés et cela fonctionne bien. Testé dans IE9, Chrome et Firefox - semble fonctionner correctement.

<!DOCTYPE html>
<html>
    <head>
        <meta charset='utf-8'>
        <meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
        <title>Bethanie Inc. data : geographically linked</title>
        <script src='http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js'></script>
        <script src='https://maps.googleapis.com/maps/api/js?v=3.11&sensor=false' type='text/javascript'></script>
        <script type='text/javascript'> 
        // check DOM Ready
        $(document).ready(function() {
            // execute
            (function() {
                /////////////// Addresses ///////////////////
                var locations = new Array();
                var i = 0;
                locations[i++] = 'L,Riversea: Comp Site1 at Riversea,1 Wallace Lane Mosman Park WA 6012'
                locations[i++] = 'L,Wearne: Comp Site2 at Wearne,1 Gibney St Cottesloe WA 6011'
                locations[i++] = 'L,Beachside:Comp Site3 Beachside,629 Two Rocks Rd Yanchep WA 6035'

                /////// Addresses/////////
                var total_locations = i;
                i = 0;
                console.log('About to look up ' + total_locations + ' locations');
                // map options
                var options = {
                    zoom: 10,
                    center: new google.maps.LatLng(-31.982484, 115.789329),//Bethanie  
                    mapTypeId: google.maps.MapTypeId.ROADMAP,
                    mapTypeControl: true
                };
                // init map
                console.log('Initialise map...');
                var map = new google.maps.Map(document.getElementById('map_canvas'), options);
               // use the Google API to translate addresses to GPS coordinates 
               //(See Limits: https://developers.google.com/maps/documentation/geocoding/#Limits)
                var geocoder = new google.maps.Geocoder();
                if (geocoder) {
                    console.log('Got a new instance of Google Geocoder object');
                    // Call function 'createNextMarker' every second
                    var myVar = window.setInterval(function(){createNextMarker()}, 700);
                    function createNextMarker() {
                        if (i < locations.length) 
                       {
                            var customer = locations[i];
                            var parts = customer.split(','); // split line into parts (fields)
                            var type= parts.splice(0,1);    // type from location line (remove)
                            var name = parts.splice(0,1);    // name from location line(remove)
                            var address =parts.join(',');   // combine remaining parts
                            console.log('Looking up ' + name + ' at address ' + address);
                            geocoder.geocode({ 'address': address }, makeCallback(name, type));
                            i++; // next location in list
                            updateProgressBar(i / total_locations);


                        } else 
                       {
                            console.log('Ready looking up ' + i + ' addresses');
                            window.clearInterval(myVar);
                        }
                    }

                    function makeCallback(name,type) 
                   {
                        var geocodeCallBack = function (results, status) {
                            if (status == google.maps.GeocoderStatus.OK) {
                                var longitude = results[0].geometry.location.lng();
                                var latitude = results[0].geometry.location.lat();
                                console.log('Received result: lat:' + latitude + ' long:' + longitude);
                                var marker = new google.maps.Marker({
                                    position: new google.maps.LatLng(latitude, longitude),
                                    map: map,
                                    title: name + ' : ' + '\r\n' + results[0].formatted_address});// this is display in tool tip/ icon color
                                   if (type=='E')  {marker.setIcon('http://maps.google.com/mapfiles/ms/icons/green-dot.png')};
rchacko
la source
-1

Récemment, j'ai rencontré un problème avec l'optimisation de la recherche Google. S'il contient des guillemets simples, il ne semble pas explorer les pages liées.

Gena Moroz
la source
1
Est-ce seulement dans les <a href=''>attributs?
AntonChanning
-2

... ou utilisez simplement des heredocs. Ensuite, vous n'avez pas à vous soucier d'échapper à autre chose END.

mcandre
la source
Je crois que vous faites référence à la capacité heredoc de PHP .
DavidRR
Je ne sais pas pourquoi cette réponse est rejetée compte tenu du contexte de la question initiale Il ne répond pas directement au problème des doubles versets simples, mais il résout le problème d'échappement php qui conduit OP à privilégier les guillemets simples en premier lieu. Cela pourrait faire avec un exemple d'utilisation cependant.
AntonChanning
-10

Les guillemets simples conviennent pour HTML, mais ils ne font pas de XHTML valide, ce qui pourrait être problématique si quelqu'un utilisait un navigateur qui ne supportait que XHTML, mais pas HTML. Je ne crois pas qu'il existe de tels navigateurs, bien qu'il y ait probablement des agents utilisateurs qui nécessitent un XHTML strict.

Adam Ness
la source
le pire, ce sont les gens qui écrivent des pages HTML mais les marquent comme XHTML parce que c'est «mieux». heureusement, cette mode semble être en baisse.
Javier
4
Je ne pense pas que cette déclaration sur XHTML soit vraie. Les deux "et" sont acceptables en XML, et le validateur du W3C accepte les documents XHTML avec des attributs à guillemets simples. Peut-être que cela peut être une confusion avec XHTML éliminant les attributs non-entre guillemets qui sont légaux en HTML?
Doug McClean
À moins que vous ne diffusiez votre page sous forme de texte / xhtml et non de texte / html, les navigateurs la rendront au format HTML, les règles HTML s'appliqueront donc. Sans regret, l'un des principes du w3C est de ne pas casser le web Parce que cela fonctionne maintenant, cela fonctionnera probablement demain.
Diodeus - James MacFarlane
8
XHTML nécessite que les pages soient du XML bien formé, et XML autorise les guillemets doubles ou simples autour des attributs.
Ned Batchelder
@SoftwareMonkey En fait, vous avez besoin de application/xhtml+xmlou application/xml.
rink.attendant 6