Czy pojedyncze cudzysłowy są dozwolone w HTML?


146

Jestem dużym użytkownikiem używającym podwójnych cudzysłowów w PHP, dzięki czemu mogę interpolować zmienne zamiast łączyć ciągi. W rezultacie podczas generowania kodu HTML często używam pojedynczych cudzysłowów do ustawiania pól znaczników. Na przykład:

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

Teraz jest to dla mnie o wiele bardziej czytelne niż inne

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

lub

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

Z krótkich wyszukiwań słyszałem ludzi, którzy mówili, że pojedyncze cudzysłowy dla pól HTML nie są rozpoznawane przez KAŻDĄ przeglądarkę. Dlatego zastanawiam się, które przeglądarki miałyby problemy z rozpoznaniem pojedynczego cudzysłowu w HTML?


Odpowiedzi:


149

Jest to podobne do Kiedy pojedyncze cudzysłowy w HTML stały się tak popularne? . Pojedyncze cudzysłowy wokół atrybutów w HTML są i zawsze były dozwolone w specyfikacji . Nie sądzę, żeby żadna przeglądarka ich nie zrozumiała.


13
Jedną rzeczą, o której muszę tutaj wspomnieć, jest to, że niektórzy klienci HTML (niekonieczne przeglądarki) mają kompatybilne problemy z pojedynczym cytowaniem. Dziwnym przykładem jest to, że w Hotmailu, jeśli używasz <img src='cid:xxx' ... />do wyświetlania obrazu w tekście, nie pojawi się on w ogóle, ponieważ identyfikator treści został zignorowany. Zamiast tego musisz użyć `<img src =" cid: xxx "... />.
Earth Engine

52

Jak zauważył PhiLho, chociaż istnieje szeroko rozpowszechnione przekonanie, że pojedyncze cudzysłowy nie są dozwolone dla wartości atrybutów, to przekonanie jest błędne.

Standard XML dopuszcza zarówno pojedyncze, jak i podwójne cudzysłowy wokół wartości atrybutów.

Standard XHTML nie mówi nic, aby to zmienić, ale powiązana sekcja, która stwierdza, że wartości atrybutów muszą być cytowane w przykładzie, używa podwójnych cudzysłowów w przykładzie, co prawdopodobnie doprowadziło do tego zamieszania. Ten przykład tylko wskazuje, że wartości atrybutów w XHTML muszą spełniać minimalne standardy dla wartości atrybutów w XML, co oznacza, że ​​muszą być cytowane (w przeciwieństwie do zwykłego HTML, który nie ma znaczenia), ale nie ogranicza cię do pojedynczego lub podwójne cudzysłowy.

Oczywiście zawsze jest możliwe, że napotkasz parser, który nie jest zgodny ze standardami, ale kiedy to się stanie, wszystkie zakłady i tak są nieważne. Dlatego najlepiej trzymać się tego, co mówi specyfikacja. Dlatego w końcu mamy specyfikacje.


2
+1 za link do standardu XML. Wiem, że to stary wątek, ale aby uzyskać kompletność, ludzie powinni zwrócić szczególną uwagę na specyfikację gramatyczną AttValue w ramach standardu. Jeśli potrafisz czytać EBNF (bardzo podobny do wyrażeń regularnych), zobaczysz, że pozwala on na użycie zarówno pojedynczych, jak i podwójnych cudzysłowów do oddzielania atrybutów.
daiscog

7
Ale HTML jest oparty na SGML (jest to XHTML, który jest oparty na XML), więc cytowanie specyfikacji XML nie jest zbyt przydatne…
Donal Fellows

Prawdziwe zamieszanie polega na tym, czy pojedyncze czy podwójne cudzysłowy w wartości atrybutu zawsze wymagają zmiany znaczenia. Wygląda na to, że jeśli użyjesz podwójnych cudzysłowów wokół wartości atrybutu, musisz uciec przed podwójnymi cudzysłowami, ale nie pojedynczymi cudzysłowami. Jeśli zamiast tego użyjesz pojedynczych cudzysłowów wokół wartości atrybutu, będziesz musiał unikać apostrofów, ale nie cudzysłowów podwójnych. I myślę, że o to właśnie chodzi w dopuszczaniu obu. Jeśli masz dużo podwójnych cudzysłowów w swojej wartości, możesz uniknąć ich zmiany znaczenia, używając pojedynczych cudzysłowów wokół całej wartości i odwrotnie.
Triynko

Faktem jest, że jeśli używasz trybu dokumentu XHTML, napotkasz problemy z interpretatorem Javascript, w których próbuje on zmusić dowolny HTML utworzony w Javascript do używania podwójnych cudzysłowów, łamiąc atrybuty za pomocą podwójnych cudzysłowów bez znaku zmiany znaczenia. Kilka lat temu napotkałem ten problem zarówno w Firefoksie, jak iw IE.
user2867288

16

Słyszałem, jak ludzie mówili, że pojedyncze cudzysłowy dla pól HTML nie są rozpoznawane przez KAŻDĄ przeglądarkę

Ta osoba się myli.


30
Niekoniecznie. Mogę w kilka minut stworzyć przeglądarkę, która nie rozpoznaje pojedynczych cudzysłowów dla pól HTML. Oczywiście będzie o wiele więcej, których nie rozpoznaje ...; P
Wyścigi lekkości na orbicie

@LightnessRacesinOrbit "Co masz na myśli mówiąc, że ta przeglądarka nie obsługuje CSS ?!"
BadHorsie

... lub co ważniejsze, „ta przeglądarka (która nie) jest martwym mięsem”. : P
ToolmakerSteve

@LightnessRacesinOrbit - ale czy masz? Wygląda na to, że ktoś na tyle zmotywowany, by cała przeglądarka poświęciła dodatkowe 5 minut na akceptację pojedynczych cudzysłowów.
user3413723

7

Nie wierz we wszystko, co widzisz w Internecie ...
Zabawne, właśnie odpowiedziałem na coś podobnego do kogoś, kto twierdzi, że pojedyncze cudzysłowy nie są poprawne w XHTML ...

Mmm, patrzę powyżej podczas pisania i widzę, że Adam N propaguje to samo przekonanie. Jeśli będzie mógł potwierdzić swoją afirmację, wycofam to, co napisałem ... AFAIK, XML jest agnostykiem i akceptuje oba rodzaje cytatów. Próbowałem nawet i sprawdziłem bez problemu stronę XHTML z pojedynczymi cudzysłowami.


4

Jedynym problemem jest to, że dane trafiają do pól TEXT INPUT. Rozważać

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

Tak samo z:

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

Nie możesz od tego uciec, musisz użyć htmlspecialchars.


2
Możesz jednak zrobić:<input value='it&apos;s gonna break'/>
rink.attendant 6

4
Myślę, że powodem, dla którego mamy możliwość używania pojedynczych lub podwójnych cudzysłowów, jest uniknięcie konieczności zmiany znaczenia znaków dokładnie w tym scenariuszu. Jeśli masz tylko cudzysłów w swojej wartości, otaczają go apostrofami, aby uniknąć konieczności ucieczki cudzysłów tak: <input value="it's not gonna break"/>i vice versa: <input value='i say - "this is not gonna be trouble"'/>.
Triynko

1
@Triynko ma rację. Poza tym: ze względu na treść rozważ przede wszystkim nie używanie „głupich cytatów”, ale „cytaty typograficzne”: takt Piotra, a nie takt Piotra. ☞ en.wikipedia.org/wiki/Quotation_mark#Quotation_marks_in_English
Frank Nocke

2

Ponieważ szukałem informacji na ten temat w znacznie nowszej wersji specyfikacji, a znalezienie ich zajęło mi trochę czasu, oto jest:

Z

HTML 5.3

Projekt redakcji, 18 października 2018

[…]

8.1.2.3. Atrybuty

Składnia wartości atrybutu w apostrofach

Nazwa atrybutu, po której następuje zero lub więcej znaków spacji, po których następuje pojedynczy znak U + 003D EQUALS SIGN, po którym następuje zero lub więcej znaków spacji, po których następuje pojedynczy znak U + 0027 APOSTROPHE ('), po którym następuje wartość atrybutu, który, oprócz wymagań podanych powyżej dla wartości atrybutów, nie może zawierać żadnych literalnych znaków U + 0027 APOSTROPHE ('), a na końcu drugiego pojedynczego znaku U + 0027 APOSTROPHE (').

W poniższym przykładzie atrybut type jest podawany za pomocą składni wartości atrybutu w apostrofach:

<input type='checkbox'>

Jeśli po atrybucie używającym składni atrybutu w pojedynczych cudzysłowach ma następować inny atrybut, to musi istnieć znak spacji oddzielający te dwa atrybuty.

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


1

Mam też tendencję do używania pojedynczych cudzysłowów w HTML i nigdy nie napotkałem problemu.


1

Użyłem pojedynczych cudzysłowów na stronach HTML i osadziłem w nim JavaScripts i działa dobrze. Testowane w IE9, Chrome i Firefox - wydaje się działać dobrze.

<!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

Ostatnio miałem problem z optymalizacją wyszukiwarki Google. Jeśli ma pojedynczy cudzysłów, nie przeszukuje powiązanych stron.


1
Czy to tylko <a href=''>atrybuty?
AntonChanning

-2

... lub po prostu użyj heredoców. Wtedy nie musisz się martwić o ucieczkę przed niczym innym END.


Myślę, że masz na myśli funkcję heredoc w PHP .
DavidRR

Nie jestem pewien, dlaczego ta odpowiedź jest odrzucana, biorąc pod uwagę kontekst oryginalnego pytania. Nie rozwiązuje bezpośrednio problemu podwójnych wersetów w pojedynczych cudzysłowach, ale rozwiązuje problem ucieczki php, który prowadzi do tego, że OP faworyzuje pojedyncze cudzysłowy. Przydałby się jednak przykład użycia.
AntonChanning

-10

Pojedyncze cudzysłowy są dobre dla HTML, ale nie tworzą prawidłowego XHTML, co mogłoby być problematyczne, gdyby ktoś używał przeglądarki obsługującej tylko XHTML, ale nie HTML. Nie sądzę, aby istniały takie przeglądarki, chociaż prawdopodobnie są tacy agenci użytkownika, które wymagają ścisłego XHTML.


gorsza część to ludzie, którzy piszą strony HTML, ale zaznaczają je jako XHTML, ponieważ jest „lepsze”. na szczęście ta moda wydaje się słabnąć.
Javier

4
Nie wierzę, że to stwierdzenie dotyczące XHTML jest prawdziwe. Zarówno ", jak i" są dopuszczalne w XML, a walidator W3C akceptuje dokumenty XHTML z atrybutami w pojedynczych cudzysłowach. Może to być mylące z XHTML eliminującym atrybuty bez cudzysłowów, które są legalne w HTML?
Doug McClean

O ile nie wyświetlasz swojej strony jako text / xhtml, a nie text / html, przeglądarki będą renderować ją jako HTML, więc będą obowiązywały reguły HTML. Niezależnie od tego, jednym z zasad w3C NIE JEST NARUSZANIE SIECI. Ponieważ działa teraz, prawdopodobnie zadziała jutro.
Diodeus - James MacFarlane

8
XHTML wymaga, aby strony były poprawnie sformułowane w formacie XML, a XML dopuszcza podwójne lub pojedyncze cudzysłowy wokół atrybutów.
Ned Batchelder

@SoftwareMonkey Właściwie potrzebujesz application/xhtml+xmllub application/xml.
rink.attendant 6
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.