Apakah kutipan tunggal diperbolehkan dalam HTML?

146

Saya seorang pengguna waktu besar menggunakan tanda kutip ganda di PHP sehingga saya bisa menginterpolasi variabel daripada string yang menyatukan. Akibatnya, ketika saya menghasilkan HTML saya sering menggunakan tanda kutip tunggal untuk pengaturan bidang tag. Sebagai contoh:

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

Sekarang ini jauh lebih mudah dibaca bagi saya daripada keduanya

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

atau

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

Dari penelusuran singkat, saya mendengar orang mengatakan bahwa tanda kutip tunggal untuk bidang HTML tidak dikenali oleh SETIAP peramban. Jadi saya bertanya-tanya browser apa yang akan mengalami masalah mengenali HTML kutipan tunggal?

Lightness Races di Orbit
sumber

Jawaban:

149

Ini mirip dengan Kapan kutipan tunggal dalam HTML menjadi sangat populer? . Kutipan tunggal di sekitar atribut dalam HTML selalu diizinkan oleh spesifikasi . Saya rasa browser tidak akan memahaminya.

Greg Hewgill
sumber
13
Satu hal yang perlu saya sebutkan di sini adalah bahwa beberapa klien HTML (tidak perlu browser) memiliki masalah yang kompatibel pada penawaran tunggal. Salah satu contoh aneh adalah bahwa di Hotmail jika Anda menggunakan <img src='cid:xxx' ... />untuk menampilkan gambar sebaris itu tidak akan muncul sama sekali karena id konten diabaikan. Anda harus menggunakan `<img src =" cid: xxx "... /> sebagai gantinya.
Mesin Bumi
52

Seperti dicatat oleh PhiLho, meskipun ada kepercayaan yang tersebar luas bahwa tanda kutip tunggal tidak diizinkan untuk nilai atribut, keyakinan itu salah.

Standar XML memungkinkan tanda kutip tunggal dan ganda di sekitar nilai atribut.

Standar XHTML tidak mengatakan apa-apa untuk mengubah ini, tetapi bagian terkait yang menyatakan bahwa nilai atribut harus dikutip menggunakan tanda kutip ganda dalam contoh, yang mungkin menyebabkan kebingungan ini. Contoh ini hanya menunjukkan bahwa nilai atribut dalam XHTML harus memenuhi standar minimum untuk nilai atribut dalam XML, yang berarti mereka harus dikutip (sebagai lawan dari HTML biasa yang tidak peduli), tetapi tidak membatasi Anda untuk satu atau kutipan ganda.

Tentu saja, selalu mungkin bahwa Anda akan menemukan parser yang tidak memenuhi standar, tetapi ketika itu terjadi semua taruhan dibatalkan. Jadi yang terbaik adalah tetap berpegang pada apa yang dikatakan spesifikasi. Itu sebabnya kami memiliki spesifikasi.

Adam Bellaire
sumber
2
+1 untuk tautan ke standar XML. Saya tahu ini adalah utas lama, tetapi untuk kelengkapan, orang harus memperhatikan spesifikasi tata bahasa AttValue dalam standar. Jika Anda dapat membaca EBNF (sangat mirip dengan ekspresi reguler) Anda akan melihat bahwa itu memungkinkan penggunaan tanda kutip tunggal dan ganda untuk membatasi atribut.
daiscog
7
Tetapi HTML didasarkan pada SGML (ini XHTML yang didasarkan pada XML) jadi mengutip spesifikasi XML tidak terlalu berguna ...
Donal Fellows
Kebingungan sebenarnya adalah apakah tanda kutip tunggal atau ganda dalam nilai atribut selalu perlu diloloskan. Tampaknya jika Anda menggunakan tanda kutip ganda di sekitar nilai atribut, maka Anda harus melarikan diri dari tanda kutip ganda, tetapi bukan tanda kutip tunggal. Jika sebaliknya Anda menggunakan tanda kutip tunggal di sekitar nilai atribut, maka Anda harus melarikan diri dari tanda kutip tunggal, tetapi bukan tanda kutip ganda. Dan saya pikir itulah inti dari mengizinkan keduanya. Jika Anda memiliki banyak tanda kutip ganda dalam nilai Anda, Anda dapat menghindarinya dengan menggunakan tanda kutip tunggal di seluruh nilai, dan sebaliknya.
Triynko
Faktanya adalah, jika Anda menggunakan mode dokumen XHTML Anda akan mengalami masalah penerjemah Javascript di mana ia mencoba untuk memaksa setiap HTML yang dibuat Javascript untuk menggunakan tanda kutip ganda, menghancurkan atribut dengan tanda kutip ganda yang tidak terhindarkan di dalamnya. Saya mengalami masalah ini di Firefox dan juga IE beberapa tahun yang lalu.
user2867288
16

Saya telah mendengar orang mengatakan bahwa tanda kutip tunggal untuk bidang HTML tidak dikenali oleh SETIAP peramban

Orang itu salah.

FlySwat
sumber
30
Belum tentu. Saya dapat membuat browser dalam beberapa menit yang tidak mengenali tanda kutip tunggal untuk bidang HTML. Tentu saja, akan ada lebih banyak lagi yang tidak dikenali ...; P
Lightness Races di Orbit
@LightnessRacesinOrbit "Apa maksudmu browser ini tidak mendukung CSS ?!"
BadHorsie
... atau lebih penting lagi, "browser itu (yang tidak) adalah daging mati". : P
ToolmakerSteve
@LightnessRacesinOrbit - tetapi apakah Anda? Sepertinya siapa pun yang cukup termotivasi untuk membuat seluruh browser akan dimasukkan ke dalam 5 menit ekstra untuk membuatnya menerima satu kutipan.
user3413723
7

Jangan percaya semua yang Anda lihat di Internet ...
Lucunya, saya baru saja menjawab sesuatu yang mirip dengan seseorang yang menyatakan tanda kutip tunggal tidak valid di XHTML ...

Mmm, saya melihat ke atas sambil mengetik, dan melihat bahwa Adam N menyebarkan keyakinan yang sama. Jika dia dapat mendukung afirmasinya, saya menarik kembali apa yang saya tulis ... AFAIK, XML agnostik dan menerima kedua jenis kutipan. Saya bahkan mencoba dan memvalidasi tanpa masalah halaman XHTML dengan hanya satu kutipan.

PhiLho
sumber
4

Satu-satunya masalah adalah data masuk ke bidang INPUT TEKS. Mempertimbangkan

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

Sama dengan:

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

Anda tidak dapat menghindarinya, Anda harus menggunakannya htmlspecialchars.

inteblio
sumber
2
Namun Anda dapat melakukan:<input value='it&apos;s gonna break'/>
rink.attendant.6
4
Saya pikir alasan kami memiliki opsi untuk menggunakan tanda kutip tunggal atau ganda adalah untuk menghindari keharusan melarikan diri karakter dalam skenario ini. Jika Anda hanya memiliki tanda kutip ganda nilai Anda, memakai tanda kutip tunggal untuk menghindari harus melarikan diri tanda kutip ganda suka begitu: <input value="it's not gonna break"/>dan sebaliknya: <input value='i say - "this is not gonna be trouble"'/>.
Triynko
1
@Triynko benar. Selain: Untuk konten , pertimbangkan untuk tidak menggunakan "kutipan bodoh", tetapi "kutipan tipografi": bilah Peter, bukan bilah Peter. ☞ en.wikipedia.org/wiki/Quotation_mark#Quotation_marks_in_English
Frank Nocke
2

Ketika saya mencari untuk menemukan informasi tentang ini dalam versi yang jauh lebih baru dari spesifikasi dan butuh beberapa waktu untuk menemukannya, ini dia:

Dari

HTML 5.3

Editor's Draft, 18 Oktober 2018

[...]

8.1.2.3. Atribut

Sintaks nilai atribut yang dikutip tunggal

Nama atribut, diikuti oleh nol atau lebih karakter spasi, diikuti oleh satu U + 003D EQUALS SIGN karakter, diikuti oleh nol atau lebih karakter spasi, diikuti oleh karakter U + 0027 APOSTROPHE tunggal ('), diikuti oleh nilai atribut, yang, di samping persyaratan yang diberikan di atas untuk nilai atribut, tidak boleh mengandung karakter APOSTROPHE U + 0027 literal ('), dan akhirnya diikuti oleh single U + 0027 APOSTROPHE karakter kedua (').

Dalam contoh berikut, atribut type diberikan dengan sintaks nilai atribut single-quote:

<input type='checkbox'>

Jika atribut menggunakan sintaks atribut single-dikutip harus diikuti oleh atribut lain, maka harus ada karakter spasi yang memisahkan keduanya.

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

connexo
sumber
1

Saya juga cenderung menggunakan tanda kutip tunggal dalam HTML dan saya tidak pernah mengalami masalah.

UnkwnTech
sumber
1

Saya menggunakan tanda kutip tunggal di halaman HTML dan menanamkan JavaScripts ke dalamnya dan berfungsi dengan baik. Diuji dalam IE9, Chrome dan Firefox - tampaknya berfungsi dengan baik.

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

Baru-baru ini saya mengalami masalah dengan optimasi Google Search. Jika memiliki tanda kutip tunggal, sepertinya tidak merangkak halaman yang ditautkan.

Gena Moroz
sumber
1
Apakah ini hanya <a href=''>atribut?
AntonChanning
-2

... atau cukup gunakan heredocs. Maka Anda tidak perlu khawatir tentang melarikan diri dari apa pun kecuali END.

mcandre
sumber
Saya percaya Anda mengacu pada kemampuan heredoc di PHP .
DavidRR
Tidak yakin mengapa jawaban ini diturunkan konteksnya dari pertanyaan awal. Itu tidak secara langsung menjawab masalah kutipan ganda ayat tunggal, tapi itu mengatasi masalah pelolosan php yang mengarah ke OP yang mendukung kutipan tunggal di tempat pertama. Namun bisa dilakukan dengan contoh penggunaan.
AntonChanning
-10

Kutipan tunggal baik untuk HTML, tetapi mereka tidak membuat XHTML yang valid, yang mungkin bermasalah jika ada yang menggunakan browser yang hanya mendukung XHTML, tetapi bukan HTML. Saya tidak percaya ada browser seperti itu, meskipun mungkin ada beberapa Agen-Pengguna di luar sana yang memang membutuhkan XHTML yang ketat.

Adam Ness
sumber
bagian yang lebih buruk adalah orang yang menulis halaman HTML tetapi menandainya sebagai XHTML karena 'lebih baik'. untung mode ini sepertinya akan turun.
Javier
4
Saya tidak percaya pernyataan tentang XHTML ini benar. Baik "dan 'dapat diterima dalam XML, dan validator W3C menerima dokumen XHTML dengan atribut yang dikutip tunggal. Mungkin ini mungkin membingungkan dengan XHTML menghapus atribut yang tidak dikutip yang legal dalam HTML?
Doug McClean
Kecuali Anda melayani halaman Anda sebagai teks / xhtml dan bukan browser teks / html akan menjadikannya sebagai HTML, maka aturan HTML akan berlaku. Sayangnya, salah satu prinsip w3C adalah BREAK untuk WEB. Karena berfungsi sekarang, kemungkinan akan bekerja besok.
Diodeus - James MacFarlane
8
XHTML mensyaratkan halaman menjadi XML yang dibentuk dengan baik, dan XML memungkinkan kutipan ganda atau tunggal di sekitar atribut.
Ned Batchelder
@SoftwareMonkey Sebenarnya, Anda membutuhkan application/xhtml+xmlatau application/xml.
rink.attendant.6