Разрешены ли одинарные кавычки в HTML?


146

Я большой пользователь использования двойных кавычек в PHP, чтобы я мог интерполировать переменные, а не объединять строки. В результате, когда я генерирую HTML, я часто использую одинарные кавычки для установки полей тегов. Например:

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

Теперь это гораздо более читабельно для меня, чем либо

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

или

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

Из коротких поисков я слышал, как люди говорили, что одинарные кавычки для полей HTML не распознаются КАЖДЫМ браузером. Поэтому мне интересно, какие браузеры будут иметь проблемы с распознаванием HTML в одинарных кавычках?


Ответы:


149

Это похоже на то, когда одинарные кавычки в HTML стали настолько популярными? , Одинарные кавычки вокруг атрибутов в HTML есть и всегда были разрешены спецификацией . Я не думаю, что любой браузер не поймет их.


13
Здесь я должен упомянуть одну вещь: у некоторых клиентов HTML (не нужных браузеров) возникают проблемы с одинарными кавычками. Одним странным примером является то, что в Hotmail, если вы используете <img src='cid:xxx' ... />для показа встроенного изображения, оно не будет отображаться вообще, потому что идентификатор контента был проигнорирован. Вместо этого вы должны использовать `<img src =" cid: xxx "... />.
Земля Двигатель

52

Как отмечает PhiLho, хотя существует широко распространенное мнение о том, что одинарные кавычки недопустимы для значений атрибутов, это мнение неверно.

Стандарт XML допускает как одинарные, так и двойные кавычки вокруг значений атрибутов.

Стандарт XHTML ничего не говорит об этом, но в соответствующем разделе говорится, что значения атрибутов должны быть заключены в кавычки заключены в используются двойные кавычки в примере, что, вероятно, привело к этой путанице. В этом примере просто указывается, что значения атрибутов в XHTML должны соответствовать минимальному стандарту для значений атрибутов в XML, что означает, что они должны заключаться в кавычки (в отличие от обычного HTML, который не заботится), но не ограничивает вас ни одним, ни двойные кавычки.

Конечно, всегда возможно, что вы столкнетесь с парсером, который не соответствует стандартам, но когда это произойдет, все ставки в любом случае отключены. Поэтому лучше всего придерживаться того, что говорится в спецификации. Вот почему у нас есть спецификации, в конце концов.


2
+1 за ссылку на стандарт XML. Я знаю, что это старый поток, но для полноты люди должны обратить особое внимание на грамматическую спецификацию AttValue в рамках стандарта. Если вы можете читать EBNF (очень похоже на регулярные выражения), вы увидите, что он позволяет использовать как одинарные, так и двойные кавычки для разделения атрибутов.
daiscog

7
Но HTML основан на SGML (это XHTML, который основан на XML), поэтому цитирование спецификации XML не очень полезно…
Донал Феллоуз

Настоящая путаница заключается в том, всегда ли необходимо избегать одинарных или двойных кавычек в значении атрибута. Кажется, что если вы используете двойные кавычки вокруг значения атрибута, то вы должны избегать двойных кавычек, но не одиночных кавычек. Если вместо этого вы используете одинарные кавычки вокруг значения атрибута, вам придется избегать одинарных кавычек, но не двойных кавычек. И я думаю, что в этом и есть смысл. Если в вашем значении много двойных кавычек, вы можете избежать их, используя одинарные кавычки вокруг всего значения, и наоборот.
Трийнко

Дело в том, что если вы используете режим документов XHTML, вы столкнетесь с проблемами интерпретатора Javascript, когда он пытается заставить любой созданный Javascript HTML использовать двойные кавычки, разбивая атрибуты с неэкранированными двойными кавычками внутри них. Я столкнулся с этой проблемой в Firefox, а также IE несколько лет назад.
user2867288

16

Я слышал, как люди говорили, что одинарные кавычки для полей HTML не распознаются КАЖДЫМ браузером

Этот человек не прав.


30
Не обязательно. Я могу за несколько минут создать браузер, который не распознает одинарные кавычки для полей HTML. Конечно, будет намного больше, чего он не узнает ...; P
Гонки Легкости на орбите

@LightnessRacesinOrbit "Что вы имеете в виду, этот браузер не поддерживает CSS ?!"
BadHorsie

... или, что более важно, "этот браузер (который не делает) - мертвое мясо". : P
ToolmakerSteve

@LightnessRacesinOrbit - а у тебя есть? Похоже, что кто-то достаточно мотивирован, чтобы весь браузер потратил лишние 5 минут, чтобы заставить его принимать одинарные кавычки.
user3413723

7

Не верь всему, что видишь в интернете ...
Как ни странно, я только что ответил на что-то похожее на то, что кто-то заявляет, что одинарные кавычки недействительны в XHTML ...

Ммм, я смотрю выше, печатая, и вижу, что Адам Н распространяет ту же веру. Если он сможет подтвердить свое утверждение, я отрекусь от того, что я написал ... AFAIK, XML является независимым и принимает оба вида цитат. Я даже без проблем пробовал и проверял страницу XHTML только с одинарными кавычками.


4

Единственная проблема - данные поступают в поля ввода текста. Рассматривать

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

То же самое с:

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

Вы не можете избежать этого, вы должны использовать htmlspecialchars.


2
Однако вы можете сделать:<input value='it&apos;s gonna break'/>
rink.attendant.6

4
Я думаю, что причина, по которой у нас есть возможность использовать одинарные или двойные кавычки, состоит в том, чтобы избежать экранирования символов именно в этом сценарии. Если у вас есть только двойные кавычки в вашем значении, окружают его в одинарных кавычках , чтобы избежать того , чтобы избежать двойных кавычек нравятся так: <input value="it's not gonna break"/>и наоборот: <input value='i say - "this is not gonna be trouble"'/>.
Трийнко

1
@ Трийнко прав. Кроме того: Для контента , в первую очередь, не используйте «тупые цитаты», а «типографские цитаты»: бар Питера, а не бар Питера. ☞ en.wikipedia.org/wiki/Quotation_mark#Quotation_marks_in_English
Фрэнк Нок

2

Поскольку я искал информацию об этом в гораздо более поздней версии спецификации и мне потребовалось довольно много времени, чтобы найти ее, вот она:

Из

HTML 5.3

Черновик редакции, 18 октября 2018 г.

[...]

8.1.2.3. Атрибуты

Синтаксис значения атрибута в одинарных кавычках

Имя атрибута, за которым следуют ноль или более пробелов, за которыми следует один символ U + 003D EQUALS SIGN, за которым следуют ноль или более пробелов, за которым следует один символ U + 0027 APOSTROPHE ('), за которым следует значение атрибута, который, в дополнение к требованиям, приведенным выше для значений атрибутов, не должен содержать никаких буквенных символов APOSTROPHE U + 0027 ('), и, наконец, после него следует второй единственный символ APOSTROPHE U + 0027 (').

В следующем примере атрибут type задается с синтаксисом значения атрибута в одинарных кавычках:

<input type='checkbox'>

Если за атрибутом, использующим синтаксис атрибута в одинарных кавычках, должен следовать другой атрибут, то между ними должен быть пробел.

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


1

Я также склонен использовать одинарные кавычки в HTML, и у меня никогда не возникало проблем.


1

Я использовал одинарные кавычки на страницах HTML и встраивал в него JavaScripts, и он отлично работает. Протестировано в IE9, Chrome и Firefox - кажется, работает нормально.

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

Недавно у меня возникла проблема с поисковой оптимизацией Google. Если есть одинарные кавычки, он не сканирует связанные страницы.


1
Это только в <a href=''>атрибутах?
AntonChanning

-2

... или просто используйте heredocs. Тогда вам не нужно беспокоиться о побеге, кроме как END.


Я полагаю, что вы имеете в виду возможность heredoc в PHP .
DavidRR

Не уверен, почему этот ответ недооценивается с учетом контекста исходного вопроса. Он не отвечает непосредственно на проблему двойных стихов в одинарных кавычках, но решает проблему с выходом php, которая приводит к тому, что OP предпочитает одинарные кавычки. Однако это можно сделать с примером использования.
AntonChanning

-10

Одиночные кавычки хороши для HTML, но они не дают действительный XHTML, что может быть проблематично, если кто-то использует браузер, который поддерживает только XHTML, но не HTML. Я не верю, что такие браузеры существуют, хотя, возможно, есть некоторые User-Agent, которым требуется строгий XHTML.


хуже всего то, что люди пишут HTML-страницы, но помечают их как XHTML, потому что это «лучше». к счастью, эта причуда, кажется, идет вниз.
Хавьер

4
Я не верю, что это утверждение о XHTML верно. И ", и" допустимы в XML, и валидатор W3C принимает документы XHTML с атрибутами, заключенными в одинарные кавычки. Возможно, это может привести к путанице с тем, что XHTML удаляет атрибуты без кавычек, которые допустимы в HTML?
Даг МакКлин,

Если вы не используете свою страницу как text / xhtml, а не text / html, браузеры будут отображать ее как HTML, поэтому будут применяться правила HTML. Несмотря ни на что, один из принципов w3C - НЕ РАЗРЫВАТЬ СЕТЬ. Поскольку это работает сейчас, это, вероятно, будет работать завтра.
Диодей - Джеймс Макфарлейн

8
XHTML требует, чтобы страницы были правильно сформированным XML, а XML допускает двойные или одинарные кавычки вокруг атрибутов.
Нед Бэтчелдер

@ SoftwareMonkey На самом деле, вам нужно application/xhtml+xmlили application/xml.
rink.attendant.6
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.