Các trích dẫn đơn có được phép trong HTML không?


146

Tôi là một người dùng thời gian lớn sử dụng dấu ngoặc kép trong PHP để tôi có thể nội suy các biến thay vì nối các chuỗi. Kết quả là, khi tôi tạo HTML, tôi thường sử dụng các trích dẫn đơn để đặt các trường thẻ. Ví dụ:

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

Bây giờ điều này đối với tôi dễ đọc hơn nhiều

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

hoặc là

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

Từ các tìm kiếm ngắn gọn, tôi đã nghe người ta nói rằng các trích dẫn đơn cho các trường HTML không được MỌI trình duyệt nhận ra. Vì vậy, tôi tự hỏi những trình duyệt nào sẽ có vấn đề khi nhận dạng HTML trích dẫn?


Câu trả lời:


149

Điều này tương tự như Khi nào các trích dẫn đơn trong HTML trở nên phổ biến? . Các trích dẫn đơn xung quanh các thuộc tính trong HTML là và luôn được đặc tả cho phép . Tôi không nghĩ rằng bất kỳ trình duyệt nào sẽ không hiểu chúng.


13
Một điều tôi cần đề cập ở đây là một số máy khách HTML (không phải trình duyệt cần thiết) có vấn đề tương đối trên một trích dẫn. Một ví dụ kỳ lạ là trong Hotmail nếu bạn sử dụng <img src='cid:xxx' ... />để hiển thị hình ảnh nội tuyến thì nó sẽ không xuất hiện chút nào vì id nội dung đã bị bỏ qua. Thay vào đó, bạn phải sử dụng `<img src =" cid: xxx "... />.
Động cơ Trái đất

52

Như PhiLho đã lưu ý, mặc dù có một niềm tin lan truyền rộng rãi rằng các trích dẫn đơn lẻ không được phép cho các giá trị thuộc tính, nhưng niềm tin đó là sai.

Các tiêu chuẩn XML cho phép cả hai dấu nháy đơn và kép quanh giá trị thuộc tính.

Tiêu chuẩn XHTML không nói bất cứ điều gì để thay đổi điều này, nhưng một phần liên quan nói rằng các giá trị thuộc tính phải được trích dẫn sử dụng dấu ngoặc kép trong ví dụ, điều này có thể dẫn đến sự nhầm lẫn này. Ví dụ này chỉ đơn thuần chỉ ra rằng các giá trị thuộc tính trong XHTML phải đáp ứng tiêu chuẩn tối thiểu cho các giá trị thuộc tính trong XML, có nghĩa là chúng phải được trích dẫn (trái ngược với HTML đơn giản không quan tâm), nhưng không giới hạn bạn ở một hoặc dấu ngoặc kép.

Tất nhiên, luôn có khả năng bạn sẽ gặp một trình phân tích cú pháp không tuân thủ tiêu chuẩn, nhưng khi điều đó xảy ra, tất cả các cược đều bị tắt. Vì vậy, tốt nhất là chỉ cần tuân theo những gì đặc điểm kỹ thuật nói. Đó là lý do tại sao chúng tôi có thông số kỹ thuật, sau tất cả.


2
+1 cho liên kết đến tiêu chuẩn XML. Tôi biết đây là một chủ đề cũ, nhưng để hoàn thiện, mọi người nên đặc biệt chú ý đến đặc tả ngữ pháp AttValue trong tiêu chuẩn. Nếu bạn có thể đọc EBNF (rất giống với biểu thức thông thường), bạn sẽ thấy rằng nó cho phép sử dụng cả dấu ngoặc đơn và dấu ngoặc kép để phân định các thuộc tính.
daiscog

7
Nhưng HTML dựa trên SGML (đó là XHTML dựa trên XML) nên việc trích dẫn thông số XML không hữu ích lắm
Donal Fellows

Sự nhầm lẫn thực sự là liệu dấu ngoặc đơn hay dấu ngoặc kép trong một giá trị thuộc tính luôn cần thoát. Có vẻ như nếu bạn sử dụng dấu ngoặc kép xung quanh giá trị thuộc tính, thì bạn phải thoát dấu ngoặc kép, nhưng không phải dấu ngoặc đơn. Nếu thay vào đó, bạn sử dụng dấu ngoặc đơn xung quanh giá trị thuộc tính, thì bạn phải thoát dấu ngoặc đơn, nhưng không phải dấu ngoặc kép. Và tôi nghĩ đó là toàn bộ quan điểm cho phép. Nếu bạn có nhiều dấu ngoặc kép trong giá trị của mình, bạn có thể tránh thoát chúng bằng cách sử dụng dấu ngoặc đơn xung quanh toàn bộ giá trị và ngược lại.
Triynko

Thực tế của vấn đề là, nếu bạn sử dụng chế độ tài liệu XHTML, bạn sẽ gặp phải các vấn đề về trình thông dịch Javascript, nơi nó cố gắng buộc bất kỳ HTML nào do Javascript tạo ra để sử dụng dấu ngoặc kép, phá vỡ các thuộc tính có dấu ngoặc kép không được giải mã bên trong chúng. Tôi gặp vấn đề này trong Firefox cũng như IE vài năm trước.
dùng2867288

16

Tôi đã nghe mọi người nói rằng các trích dẫn đơn cho các trường HTML không được MỌI trình duyệt nhận ra

Người đó sai rồi.


30
Không cần thiết. Tôi có thể tạo một trình duyệt trong vài phút mà không nhận ra các trích dẫn đơn cho các trường HTML. Tất nhiên, sẽ còn rất nhiều điều mà nó không nhận ra ...; P
Các cuộc đua Ánh sáng trong Quỹ đạo

@LightnessRacesinOrbit "Ý bạn là trình duyệt này không hỗ trợ CSS?!"
BadHorsie

... Hoặc quan trọng hơn, "trình duyệt đó (không phải) là thịt chết". : P
ToolmakerSteve

@LightnessRacesinOrbit - nhưng có bạn? Có vẻ như bất kỳ ai đủ động lực để làm cho toàn bộ trình duyệt sẽ đặt thêm 5 phút nữa để khiến nó chấp nhận các trích dẫn đơn lẻ.
dùng3413723

7

Đừng tin tất cả mọi thứ bạn thấy trên Internet ...
Vui thay, tôi vừa trả lời một cái gì đó tương tự như ai đó tuyên bố các trích dẫn đơn lẻ không hợp lệ trong XHTML ...

Mmm, tôi nhìn phía trên trong khi gõ, và thấy rằng Adam N truyền bá cùng một niềm tin. Nếu anh ta có thể sao lưu lời khẳng định của mình, tôi rút lại những gì tôi đã viết ... AFAIK, XML là bất khả tri và chấp nhận cả hai loại trích dẫn. Tôi thậm chí đã thử và xác nhận mà không gặp sự cố một trang XHTML chỉ với các trích dẫn duy nhất.


4

Vấn đề duy nhất là dữ liệu đi vào các trường INPUT. Xem xét

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

Giống với:

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

Bạn không thể thoát khỏi điều đó, bạn phải sử dụng htmlspecialchars.


2
Tuy nhiên, bạn có thể làm:<input value='it&apos;s gonna break'/>
rink.attguard.6

4
Tôi nghĩ lý do chúng ta có tùy chọn sử dụng dấu ngoặc đơn hoặc dấu ngoặc kép là để tránh phải thoát các ký tự trong chính xác kịch bản này. Nếu bạn chỉ có dấu ngoặc kép trong giá trị của mình, hãy bao quanh nó bằng dấu ngoặc đơn để tránh phải thoát dấu ngoặc kép như vậy: <input value="it's not gonna break"/>và ngược lại : <input value='i say - "this is not gonna be trouble"'/>.
Triynko

1
@Triynko nói đúng. Bên cạnh đó: Đối với nội dung , hãy cân nhắc việc không sử dụng "trích dẫn câm" ở vị trí đầu tiên, nhưng trích dẫn kiểu chữ tiếng Nhật là: Thanh của Peter, không phải thanh của Peter. ☞ en.wikipedia.org/wiki/Quotation_mark#Quotation_mark_in_English
Frank Nocke

2

Khi tôi đang tìm kiếm thông tin về điều này trong một phiên bản gần đây hơn của đặc tả và tôi đã mất khá nhiều thời gian để tìm thấy nó, đây là:

Từ

HTML 5.3

Dự thảo của biên tập viên, ngày 18 tháng 10 năm 2018

[...]

8.1.2.3. Thuộc tính

Cú pháp giá trị thuộc tính trích dẫn đơn

Tên thuộc tính, theo sau là 0 hoặc nhiều ký tự khoảng trắng, theo sau là một ký tự U + 003D THIẾT BỊ duy nhất, theo sau là 0 hoặc nhiều ký tự khoảng trắng, theo sau là một ký tự U + 0027 APOSTROPHE ('), theo sau là giá trị thuộc tính, trong đó, ngoài các yêu cầu được đưa ra ở trên đối với các giá trị thuộc tính, không được chứa bất kỳ ký tự U + 0027 APOSTROPHE theo nghĩa đen nào (') và cuối cùng là ký tự U + 0027 APOSTROPHE thứ hai (').

Trong ví dụ sau, thuộc tính type được đưa ra với cú pháp giá trị thuộc tính trích dẫn đơn:

<input type='checkbox'>

Nếu một thuộc tính sử dụng cú pháp thuộc tính trích dẫn đơn được theo sau bởi một thuộc tính khác, thì phải có một ký tự khoảng trắng ngăn cách hai.

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


1

Tôi cũng có xu hướng sử dụng các trích dẫn đơn trong HTML và tôi chưa bao giờ gặp sự cố.


1

Tôi đã sử dụng các trích dẫn đơn trong các trang HTML và nhúng JavaScripts vào nó và nó hoạt động tốt. Đã thử nghiệm trong IE9, Chrome và Firefox - có vẻ hoạt động tốt.

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

Gần đây tôi đã gặp sự cố với tối ưu hóa Tìm kiếm của Google. Nếu có một dấu ngoặc đơn, nó dường như không thu thập dữ liệu các trang được liên kết.


1
Đây chỉ là trong <a href=''>thuộc tính?
AntonChanning 18/03/2016

-2

... Hoặc chỉ sử dụng heredocs. Sau đó, bạn không cần phải lo lắng về việc thoát khỏi bất cứ điều gì nhưng END.


Tôi tin rằng bạn đang đề cập đến khả năng heredoc trong PHP .
DavidRR

Không chắc chắn lý do tại sao câu trả lời này được đánh giá thấp bối cảnh cho câu hỏi ban đầu. Nó không trả lời trực tiếp vấn đề trích dẫn hai câu đơn, nhưng nó giải quyết vấn đề thoát php dẫn đến việc OP ưu tiên trích dẫn đơn ở vị trí đầu tiên. Nó có thể làm với một ví dụ về việc sử dụng tuy nhiên.
AntonChanning 18/03/2016

-10

Các trích dẫn đơn là tốt cho HTML, nhưng chúng không tạo XHTML hợp lệ, điều này có thể gây ra vấn đề nếu bất kỳ ai đang sử dụng trình duyệt chỉ hỗ trợ XHTML, nhưng không phải HTML. Tôi không tin bất kỳ trình duyệt nào như vậy tồn tại, mặc dù có thể có một số Tác nhân người dùng ngoài đó yêu cầu XHTML nghiêm ngặt.


phần tồi tệ hơn là những người viết các trang HTML nhưng đánh dấu chúng là XHTML vì nó 'tốt hơn'. may mắn là mốt này dường như đang đi xuống.
Javier

4
Tôi không tin tuyên bố này về XHTML là đúng. Cả "và 'đều được chấp nhận trong XML và trình xác thực W3C chấp nhận các tài liệu XHTML với các thuộc tính được trích dẫn đơn lẻ. Có lẽ đây có thể là một sự nhầm lẫn với XHTML loại bỏ các thuộc tính không được trích dẫn là hợp pháp trong HTML?
Doug McClean

Trừ khi bạn phục vụ trang của mình dưới dạng văn bản / xhtml và không phải trình duyệt văn bản / html sẽ hiển thị trang đó dưới dạng HTML, vì vậy các quy tắc HTML sẽ được áp dụng. Bất kể, một trong những nguyên tắc của w3C là KHÔNG BẮT ĐẦU WEB. Bởi vì nó hoạt động bây giờ, nó có thể sẽ làm việc vào ngày mai.
Diodeus - James MacFarlane

8
XHTML yêu cầu các trang phải là XML được định dạng tốt và XML cho phép trích dẫn kép hoặc đơn xung quanh các thuộc tính.
Ned Batchelder

@SoftwareMonkey Thật ra, bạn cần application/xhtml+xmlhay application/xml.
rink.attguard.6
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.