Sind einfache Anführungszeichen in HTML zulässig?


146

Ich bin ein großer Benutzer der Verwendung von doppelten Anführungszeichen in PHP, damit ich Variablen interpolieren kann, anstatt Zeichenfolgen zu verketten. Daher verwende ich beim Generieren von HTML häufig einfache Anführungszeichen zum Festlegen von Tag-Feldern. Beispielsweise:

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

Das ist für mich weitaus besser lesbar als beides

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

oder

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

Bei kurzen Suchanfragen habe ich gehört, dass einfache Anführungszeichen für HTML-Felder nicht von JEDEM Browser erkannt werden. Daher frage ich mich, welche Browser Probleme haben würden, HTML in einfachen Anführungszeichen zu erkennen.


Antworten:


149

Dies ist ähnlich wie Wann sind einfache Anführungszeichen in HTML so beliebt geworden? . Einfache Anführungszeichen um Attribute in HTML wurden und werden von der Spezifikation immer zugelassen . Ich glaube nicht, dass ein Browser sie nicht verstehen würde.


13
Eine Sache, die ich hier erwähnen muss, ist, dass einige HTML-Clients (nicht notwendige Browser) kompatible Probleme mit einfachen Anführungszeichen haben. Ein seltsames Beispiel ist, dass in Hotmail <img src='cid:xxx' ... />ein Inline-Bild überhaupt nicht angezeigt wird, wenn es verwendet wird , da die Inhalts-ID ignoriert wurde. Sie müssen stattdessen `<img src =" cid: xxx "... /> verwenden.
Earth Engine

52

Wie von PhiLho festgestellt, ist diese Überzeugung falsch, obwohl es eine weit verbreitete Überzeugung gibt, dass einfache Anführungszeichen für Attributwerte nicht zulässig sind.

Der XML-Standard erlaubt sowohl einfache als auch doppelte Anführungszeichen um Attributwerte.

Der XHTML-Standard sagt nichts aus, um dies zu ändern, aber ein verwandter Abschnitt, der besagt, dass Attributwerte in Anführungszeichen gesetzt werden müssen, verwendet im Beispiel doppelte Anführungszeichen, was wahrscheinlich zu dieser Verwirrung geführt hat. In diesem Beispiel wird lediglich darauf hingewiesen, dass Attributwerte in XHTML den Mindeststandard für Attributwerte in XML erfüllen müssen. Dies bedeutet, dass sie in Anführungszeichen gesetzt werden müssen (im Gegensatz zu einfachem HTML, das sich nicht darum kümmert), Sie jedoch nicht auf einzelne oder beschränken Anführungszeichen.

Natürlich ist es immer möglich, dass Sie auf einen Parser stoßen, der nicht den Standards entspricht, aber wenn dies passiert, sind alle Wetten trotzdem ungültig. Halten Sie sich also am besten an die Angaben in der Spezifikation. Deshalb haben wir schließlich Spezifikationen.


2
+1 für den Link zum XML-Standard. Ich weiß, dass dies ein alter Thread ist, aber der Vollständigkeit halber sollten die Leute der AttValue- Grammatikspezifikation innerhalb des Standards besondere Aufmerksamkeit schenken . Wenn Sie EBNF lesen können (sehr ähnlich zu regulären Ausdrücken), werden Sie feststellen, dass sowohl einfache als auch doppelte Anführungszeichen zum Abgrenzen von Attributen verwendet werden können.
Daiscog

7
Aber HTML basiert auf SGML (es ist XHTML, das auf XML basiert), so dass das Zitieren der XML-Spezifikation nicht sehr nützlich ist…
Donal Fellows

Die wirkliche Verwirrung besteht darin, ob einfache oder doppelte Anführungszeichen in einem Attributwert immer maskiert werden müssen. Wenn Sie doppelte Anführungszeichen um den Attributwert verwenden, müssen Sie anscheinend doppelte Anführungszeichen, jedoch keine einfachen Anführungszeichen verwenden. Wenn Sie stattdessen einfache Anführungszeichen um den Attributwert verwenden, müssen Sie einfache Anführungszeichen, jedoch keine doppelten Anführungszeichen verwenden. Und ich denke, das ist der springende Punkt, um beides zuzulassen. Wenn Ihr Wert viele doppelte Anführungszeichen enthält, können Sie vermeiden, dass Sie ihnen entkommen, indem Sie einfache Anführungszeichen um den gesamten Wert verwenden und umgekehrt.
Triynko

Tatsache ist, wenn Sie einen XHTML-Dokumentmodus verwenden, treten Probleme mit dem Javascript-Interpreter auf, bei denen versucht wird, von Javascript erstellten HTML-Code zu zwingen, doppelte Anführungszeichen zu verwenden, wobei Attribute mit nicht entkoppelten doppelten Anführungszeichen in ihnen gebrochen werden. Ich bin vor einigen Jahren sowohl in Firefox als auch im Internet Explorer auf dieses Problem gestoßen.
user2867288

16

Ich habe Leute sagen hören, dass einfache Anführungszeichen für HTML-Felder nicht von JEDEM Browser erkannt werden

Diese Person ist falsch.


30
Nicht unbedingt. Ich kann in wenigen Minuten einen Browser erstellen, der keine einfachen Anführungszeichen für HTML-Felder erkennt. Natürlich wird es noch viel mehr geben, das es nicht erkennt ...; P
Leichtigkeitsrennen im Orbit

@LightnessRacesinOrbit "Was meinst du damit, dass dieser Browser CSS nicht unterstützt?!"
BadHorsie

... oder was noch wichtiger ist, "dieser Browser (der dies nicht tut) ist totes Fleisch". : P
ToolmakerSteve

@LightnessRacesinOrbit - aber hast du? Es scheint, als würde jeder, der motiviert genug ist, einen ganzen Browser zu erstellen, zusätzliche 5 Minuten investieren, damit er einfache Anführungszeichen akzeptiert.
user3413723

7

Glauben Sie nicht alles, was Sie im Internet sehen ...
Lustigerweise habe ich gerade etwas Ähnliches beantwortet wie jemand, der erklärt, dass einfache Anführungszeichen in XHTML nicht gültig sind ...

Mmm, ich schaue beim Tippen nach oben und sehe, dass Adam N den gleichen Glauben verbreitet. Wenn er seine Behauptung stützen kann, ziehe ich zurück, was ich geschrieben habe ... AFAIK, XML ist agnostisch und akzeptiert beide Arten von Zitaten. Ich habe sogar problemlos eine XHTML-Seite mit nur einfachen Anführungszeichen ausprobiert und validiert.


4

Das einzige Problem ist, dass Daten in TEXT INPUT-Felder gelangen. Erwägen

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

Das gleiche mit:

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

Dem kannst du nicht entkommen, du musst es benutzen htmlspecialchars.


2
Sie können jedoch tun:<input value='it&apos;s gonna break'/>
rink.attendant.6

4
Ich denke, der Grund, warum wir die Möglichkeit haben, einfache oder doppelte Anführungszeichen zu verwenden, besteht darin, zu vermeiden, dass in genau diesem Szenario Zeichen maskiert werden müssen. Wenn Ihr Wert nur doppelte Anführungszeichen enthält, umgeben Sie ihn mit einfachen Anführungszeichen, um zu vermeiden, dass Sie den doppelten Anführungszeichen wie folgt entkommen müssen: <input value="it's not gonna break"/>und umgekehrt : <input value='i say - "this is not gonna be trouble"'/>.
Triynko

1
@Triynko ist richtig. Übrigens: Für Inhalte , sollten nicht „dumb quotes“ an erster Stelle verwenden, aber „typografische Anführungszeichen“: Peter Bar, nicht Peters Bar. ☞ en.wikipedia.org/wiki/Quotation_mark#Quotation_marks_in_English
Frank Nocke

2

Da ich nach Informationen zu diesem Thema in einer viel neueren Version der Spezifikation gesucht habe und es einige Zeit gedauert habe, sie zu finden, ist sie hier:

Von

HTML 5.3

Redaktionsentwurf, 18. Oktober 2018

[...]

8.1.2.3. Attribute

Attributwertsyntax in einfachen Anführungszeichen

Der Attributname, gefolgt von null oder mehr Leerzeichen, gefolgt von einem einzelnen U + 003D EQUALS SIGN-Zeichen, gefolgt von null oder mehr Leerzeichen, gefolgt von einem einzelnen U + 0027 APOSTROPHE-Zeichen ('), gefolgt vom Attributwert. die zusätzlich zu den oben angegebenen Anforderungen für Attributwerte keine wörtlichen U + 0027 APOSTROPHE-Zeichen (') enthalten darf, gefolgt von einem zweiten einzelnen U + 0027 APOSTROPHE-Zeichen (').

Im folgenden Beispiel wird das Typattribut mit der Attributwertsyntax in einfachen Anführungszeichen angegeben:

<input type='checkbox'>

Wenn auf ein Attribut mit der Attributsyntax in einfachen Anführungszeichen ein anderes Attribut folgen soll, muss ein Leerzeichen zwischen den beiden stehen.

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


1

Ich neige auch dazu, einfache Anführungszeichen in HTML zu verwenden, und ich habe noch nie ein Problem festgestellt.


1

Ich habe einfache Anführungszeichen in HTML-Seiten verwendet und JavaScripts darin eingebettet, und es funktioniert einwandfrei. In IE9, Chrome und Firefox getestet - scheint gut zu funktionieren.

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

Vor kurzem habe ich ein Problem mit der Optimierung der Google-Suche festgestellt. Wenn es einfache Anführungszeichen gibt, scheint es keine verknüpften Seiten zu crawlen.


1
Ist das nur in <a href=''>Attributen?
AntonChanning

-2

... oder einfach Heredocs benutzen. Dann brauchen Sie sich keine Sorgen zu machen, außer irgendetwas zu entkommen END.


Ich glaube, Sie beziehen sich auf die Heredoc-Fähigkeit in PHP .
DavidRR

Ich bin mir nicht sicher, warum diese Antwort im Kontext der ursprünglichen Frage abgelehnt wird. Es beantwortet nicht direkt das Problem der doppelten Verse in einfachen Anführungszeichen, aber es behebt das Problem der PHP-Flucht, das dazu führt, dass OP in erster Linie einfache Anführungszeichen bevorzugt. Es könnte jedoch ein Anwendungsbeispiel gebrauchen.
AntonChanning

-10

Einfache Anführungszeichen sind für HTML in Ordnung, stellen jedoch kein gültiges XHTML dar. Dies kann problematisch sein, wenn jemand einen Browser verwendet, der nur XHTML, jedoch kein HTML unterstützt. Ich glaube nicht, dass es solche Browser gibt, obwohl es wahrscheinlich einige User-Agents gibt, die striktes XHTML erfordern.


Das Schlimmste sind Leute, die HTML-Seiten schreiben, diese aber als XHTML markieren, weil es "besser" ist. Zum Glück scheint diese Modeerscheinung zu sinken.
Javier

4
Ich glaube nicht, dass diese Aussage über XHTML wahr ist. Sowohl "als auch" sind in XML akzeptabel, und der W3C-Validator akzeptiert XHTML-Dokumente mit Attributen in einfachen Anführungszeichen. Vielleicht kann dies eine Verwechslung mit XHTML sein, wenn nicht zitierte Attribute eliminiert werden, die in HTML legal sind?
Doug McClean

Sofern Sie Ihre Seite nicht als Text / XHTML und nicht als Text / HTML-Browser bereitstellen, wird sie von Browsern als HTML gerendert, sodass HTML-Regeln gelten. Trotzdem ist es eines der w3C-Prinzipien, das Web nicht zu brechen. Weil es jetzt funktioniert, wird es wahrscheinlich morgen funktionieren.
Diodeus - James MacFarlane

8
Für XHTML müssen Seiten wohlgeformtes XML sein, und XML ermöglicht doppelte oder einfache Anführungszeichen um Attribute.
Ned Batchelder

@ SoftwareMonkey Eigentlich brauchst du application/xhtml+xmloder application/xml.
rink.attendant.6
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.