Sono consentite virgolette singole in HTML?


146

Sono un grande utilizzatore di utilizzare virgolette doppie in PHP in modo da poter interpolare le variabili anziché concatenare le stringhe. Di conseguenza, quando sto generando HTML, utilizzo spesso virgolette singole per impostare i campi tag. Per esempio:

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

Ora questo è molto più leggibile per me di entrambi

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

o

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

Da brevi ricerche ho sentito persone dire che le virgolette singole per i campi HTML non sono riconosciute da OGNI browser. Quindi mi chiedo quali browser avrebbero problemi a riconoscere HTML a virgoletta singola?


Risposte:


149

Questo è simile a Quando le virgolette singole in HTML sono diventate così popolari? . Le virgolette singole intorno agli attributi in HTML sono e sono sempre state consentite dalla specifica . Non credo che i browser non li capiscano.


13
Una cosa che devo menzionare qui è che alcuni client HTML (non i browser necessari) hanno problemi di compatibilità con le offerte singole. Uno strano esempio è che in Hotmail se si utilizza <img src='cid:xxx' ... />per mostrare un'immagine incorporata, questa non apparirà affatto perché l'id del contenuto è stato ignorato. Devi invece usare `<img src =" cid: xxx "... />.
Earth Engine,

52

Come notato da PhiLho, anche se esiste una convinzione ampiamente diffusa che le virgolette singole non sono consentite per i valori degli attributi, tale convinzione è errata.

Lo standard XML consente virgolette singole e doppie attorno ai valori degli attributi.

Lo standard XHTML non dice nulla per cambiarlo, ma una sezione correlata che afferma che i valori degli attributi devono essere citati usa doppie virgolette nell'esempio, che probabilmente ha portato a questa confusione. Questo esempio sta semplicemente sottolineando che i valori degli attributi in XHTML devono soddisfare lo standard minimo per i valori degli attributi in XML, il che significa che devono essere quotati (al contrario del semplice HTML a cui non importa), ma non ti limita a single o virgolette.

Ovviamente, è sempre possibile incontrare un parser che non è conforme agli standard, ma quando ciò accade tutte le scommesse sono comunque disattivate. Quindi è meglio attenersi a ciò che dice la specifica. Ecco perché abbiamo delle specifiche, dopo tutto.


2
+1 per il collegamento allo standard XML. So che questo è un vecchio thread, ma per completezza, le persone dovrebbero prestare particolare attenzione alle specifiche grammaticali AttValue all'interno dello standard. Se riesci a leggere EBNF (molto simile alle espressioni regolari) vedrai che consente l'uso di virgolette singole e doppie per delimitare gli attributi.
daiscog,

7
Ma HTML si basa su SGML (è XHTML che si basa su XML), quindi citare le specifiche XML non è molto utile ...
Donal Fellows

La vera confusione è se le virgolette singole o doppie in un valore di attributo devono sempre essere evitate. Sembra che se usi le virgolette doppie attorno al valore dell'attributo, devi evitare le virgolette doppie, ma non quelle singole. Se invece utilizzi virgolette singole attorno al valore dell'attributo, dovresti evitare le virgolette singole, ma non quelle doppie. E penso che sia questo il punto di consentire entrambi. Se hai molte virgolette doppie nel tuo valore, puoi evitare di sfuggirle usando le virgolette singole attorno all'intero valore e viceversa.
Triynko,

Il fatto è che, se si utilizza una modalità documento XHTML, si verificheranno problemi con l'interprete Javascript in cui si tenta di forzare qualsiasi HTML creato da Javascript a utilizzare virgolette doppie, rompendo gli attributi con virgolette doppie senza escape al loro interno. Ho riscontrato questo problema in Firefox e IE diversi anni fa.
user2867288

16

Ho sentito gente dire che le virgolette singole per i campi HTML non sono riconosciute da OGNI browser

Quella persona ha torto.


30
Non necessariamente. Posso creare un browser in pochi minuti che non riconosce le virgolette singole per i campi HTML. Certo, ci sarà molto di più che non riconosce ...; P
Razze di leggerezza in orbita,

@LightnessRacesinOrbit "Cosa intendi con questo browser non supporta i CSS ?!"
BadHorsie,

... o, soprattutto, "quel browser (che non lo fa) è carne morta". : P
ToolmakerSteve

@LightnessRacesinOrbit - ma tu? Sembra che chiunque sia abbastanza motivato da creare un intero browser impiegherà 5 minuti in più per farlo accettare virgolette singole.
user3413723

7

Non credere a tutto ciò che vedi su Internet ...
Stranamente, ho appena risposto a qualcosa di simile a qualcuno che dichiara che le virgolette singole non sono valide in XHTML ...

Mmm, guardo sopra mentre scrivo e vedo che Adam N propaga la stessa convinzione. Se riesce a sostenere la sua affermazione, ritiro ciò che ho scritto ... AFAIK, XML è agnostico e accetta entrambi i tipi di citazione. Ho anche provato e convalidato senza problemi una pagina XHTML con solo virgolette singole.


4

L'unico problema sono i dati che vanno nei campi INPUT TESTO. Tener conto di

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

Lo stesso con:

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

Non puoi sfuggire a quello, devi usare htmlspecialchars.


2
Puoi comunque fare:<input value='it&apos;s gonna break'/>
rink.attendant.6

4
Penso che il motivo per cui abbiamo la possibilità di usare virgolette singole o doppie sia quello di evitare di dover sfuggire ai personaggi esattamente in questo scenario. Se si dispone solo doppi apici nel vostro valore, circondarlo con apici per evitare di dover sfuggire le virgolette in questo modo: <input value="it's not gonna break"/>e viceversa: <input value='i say - "this is not gonna be trouble"'/>.
Triynko,

1
@Triynko ha ragione. Inoltre: per i contenuti , considera innanzitutto di non utilizzare "citazioni stupide", ma "virgolette tipografiche": la barra di Peter, non la barra di Peter. ☞ en.wikipedia.org/wiki/Quotation_mark#Quotation_marks_in_English
Frank Nocke

2

Mentre stavo cercando di trovare informazioni su questo in una versione molto più recente delle specifiche e mi ci è voluto un po 'di tempo per trovarle, eccolo qui:

A partire dal

HTML 5.3

Editor's Draft, 18 ottobre 2018

[...]

8.1.2.3. attributi

Sintassi del valore dell'attributo a virgoletta singola

Il nome dell'attributo, seguito da zero o più caratteri spazio, seguito da un singolo carattere U + 003D EQUALS SIGN, seguito da zero o più caratteri spazio, seguito da un singolo carattere U + 0027 APOSTROPHE ('), seguito dal valore dell'attributo, che, oltre ai requisiti sopra indicati per i valori degli attributi, non deve contenere caratteri U + 0027 APOSTROPHE letterali (') e infine seguito da un secondo carattere U + 0027 APOSTROPHE (').

Nel seguente esempio, l'attributo type viene fornito con la sintassi del valore dell'attributo a virgoletta singola:

<input type='checkbox'>

Se un attributo che utilizza la sintassi dell'attributo a virgoletta singola deve essere seguito da un altro attributo, deve esserci un carattere spazio che separa i due.

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


1

Tendo anche a usare virgolette singole in HTML e non ho mai avuto problemi.


1

Ho usato virgolette singole in pagine HTML e JavaScript incorporati e funziona benissimo. Testato su IE9, Chrome e Firefox - sembra funzionare bene.

<!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')};

-1

Di recente ho riscontrato un problema con l'ottimizzazione della Ricerca Google. Se ha una virgoletta singola, non sembra eseguire la scansione delle pagine collegate.


1
È solo negli <a href=''>attributi?
AntonChanning,

-2

... o semplicemente usa heredocs. Quindi non devi preoccuparti di sfuggire a niente ma END.


Credo che ti riferisci alla capacità ereditaria in PHP .
DavidRR

Non sono sicuro del motivo per cui questa risposta è stata sottoposta a downgrade dato il contesto della domanda originale. Non risponde direttamente al problema delle virgolette singole in versi doppi, ma affronta il problema della fuga di php che porta in primo luogo a favorire OP tra virgolette singole. Potrebbe fare comunque con un esempio di utilizzo.
AntonChanning,

-10

Le virgolette singole vanno bene per HTML, ma non rendono XHTML valido, il che potrebbe essere problematico se qualcuno stesse usando un browser che supportava solo XHTML, ma non HTML. Non credo che esistano tali browser, anche se probabilmente ci sono alcuni User-Agent là fuori che richiedono XHTML rigoroso.


la parte peggiore sono le persone che scrivono pagine HTML ma le contrassegnano come XHTML perché è "migliore". fortunatamente questa moda sembra in calo.
Javier,

4
Non credo che questa affermazione su XHTML sia vera. Entrambi "e" sono accettabili in XML e il validatore W3C accetta documenti XHTML con attributi a virgoletta singola. Forse questa potrebbe essere una confusione con XHTML che elimina gli attributi non quotati che sono legali in HTML?
Doug McClean,

A meno che tu non serva la tua pagina come text / xhtml e non i browser text / html la renderanno come HTML, quindi verranno applicate le regole HTML. Purtroppo, uno dei principi del w3C è NON Rompere il Web. Perché ora funziona, probabilmente funzionerà domani.
Diodeus - James MacFarlane il

8
XHTML richiede che le pagine siano XML ben formate e XML consente virgolette doppie o singole attorno agli attributi.
Ned Batchelder,

@SoftwareMonkey In realtà, è necessario application/xhtml+xmlo application/xml.
rink.attendant.6
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.