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时会遇到问题?


Answers:


149

这类似于HTML中的单引号什么时候变得如此流行?规范始终允许HTML的属性周围用单引号引起来。我认为没有任何浏览器不会理解它们。


13
我需要在这里提及的一件事是,某些HTML客户端(不是必需的浏览器)在单引号上存在兼容的问题。一个奇怪的例子是,在Hotmail中,如果您<img src='cid:xxx' ... />用来显示嵌入式图像,则由于内容ID被忽略,它根本不会出现。您必须改用`<img src =“ cid:xxx” ... />。
Earth Engine

52

正如PhiLho所指出的那样,尽管人们普遍认为属性值不允许使用单引号,但是这种看法是错误的。

XML标准允许各地属性值单引号和双引号。

XHTML标准没有说明要更改的内容,但是在相关示例中,指出必须属性值进行引用的示例在该示例中使用了双引号,这可能导致这种混淆。本示例仅指出XHTML中的属性值必须满足XML中的属性值的最低标准,这意味着必须将它们用引号引起来(与之无关的纯HTML无关),但并不将您限制为单个或单个。双引号。

当然,您总是有可能遇到不符合标准的解析器,但是当发生这种情况时,所有赌注都将关闭。因此,最好仅遵守规范中的规定。毕竟,这就是为什么我们有规格。


2
+1为指向XML标准的链接。我知道这是一个旧线程,但是为了完整起见,人们应该特别注意标准中的AttValue语法规范。如果您可以阅读EBNF(非常类似于正则表达式),则会看到它允许使用单引号和双引号来分隔属性。
daiscog

7
但是HTML基于SGML(它是基于XML的XHTML),因此引用XML规范不是很有用……
Donal Fellows 2012年

真正的困惑是,是否总是需要转义属性值中的单引号或双引号。似乎如果在属性值周围使用双引号,则必须转义双引号,而不是单引号。如果改为在属性值周围使用单引号,则必须转义单引号,而不是双引号。我认为这就是允许其中之一的全部重点。如果您的值中有很多双引号,则可以通过在整个值周围使用单引号来避免转义,反之亦然。
Triynko 2014年

事实是,如果您使用XHTML文档模式,则会遇到Javascript解释器问题,在Javascript解释器中,它试图强制任何Javascript创建的HTML使用双引号,从而破坏其中带有未转义双引号的属性。几年前,我在Firefox和IE中都遇到了这个问题。
user2867288'6

16

我听说有人说HTML字段的单引号不能被每个浏览器识别

那个人是错的。


30
不必要。我可以在几分钟内创建一个无法识别HTML字段单引号的浏览器。当然,还有很多它不认识的地方……; P
轨道上的灯光竞赛

@LightnessRacesinOrbit“您的意思是这个浏览器不支持CSS ?!”
BadHorsie 2015年

...或更重要的是,“那个浏览器(不是)是死肉”。:P
ToolmakerSteve16年

@LightnessRacesinOrbit-但是有吗?似乎有足够的动力来制作整个浏览器的人都将花额外的5分钟时间来接受单引号。
user3413723 '18

7

不要相信您在Internet上看到的所有内容。
有趣的是,我刚刚回答了类似于有人宣称单引号在XHTML中无效的内容...

嗯,我在打字时在上方看,看到亚当N传播了相同的信念。如果他能支持他的肯定,我将撤回我写的内容。AFAIK,XML是不可知的,并且接受两种引用。我什至尝试并验证了只有单引号的XHTML页面。


4

唯一的问题是数据进入TEXT INPUT字段。考虑

<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。13年

4
我认为我们可以选择使用单引号或双引号的原因是为了避免在这种情况下必须转义字符。如果您的值中只有双引号,请将其用单引号引起来,以避免像这样转义双引号:<input value="it's not gonna break"/>反之亦然:<input value='i say - "this is not gonna be trouble"'/>
Triynko 2014年

1
@Triynko是正确的。此外:对于内容,请首先考虑不要使用“哑引号”,而应使用“印刷引号”:彼得的酒吧,而不是彼得的酒吧。☞第en.wikipedia.org/wiki/Quotation_mark#Quotation_marks_in_English
弗兰克Nocke

2

当我希望在规范的最新版本中找到有关此信息时,花了我很多时间才能找到它,这里是:

HTML 5.3

编辑稿,2018年10月18日

[...]

8.1.2.3。属性

单引号属性值语法

属性名称,后跟零个或多个空格字符,后跟一个U + 003D等于符号字符,后跟零个或多个空格字符,后跟一个U + 0027 APOSTROPHE字符('),后跟属性值,除了上面对属性值的要求外,该字符不得包含任何文字U + 0027 APOSTROPHE字符('),最后必须包含第二个单个U + 0027 APOSTROPHE字符(')。

在下面的示例中,type属性使用单引号属性值语法给出:

<input type='checkbox'>

如果使用单引号属性语法的属性后面是另一个属性,则必须有一个空格字符将两者分开。

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


1

我也倾向于在HTML中使用单引号,但我从未遇到过问题。


1

我在HTML页面中使用了单引号,并在其中嵌入了JavaScript,并且效果很好。经过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


我相信您指的是PHP中Heredoc功能
DavidRR 2014年

在给定原始问题的上下文的情况下,不确定为什么此答案不正确。它没有直接回答双节单引号问题,但是确实解决了php转义问题,该问题导致OP首先支持单引号。但是,可以使用一个示例。
AntonChanning

-10

单引号适用于HTML,但它们不能生成有效的XHTML,如果有人使用的浏览器仅支持XHTML,但不支持HTML,则可能会出现问题。我不相信会存在这样的浏览器,尽管那里可能确实存在一些需要严格的XHTML的User-Agent。


更糟糕的是,人们编写HTML页面,但由于“更好”而将其标记为XHTML。幸运的是,这种时尚似乎正在消失。
哈维尔

4
我认为有关XHTML的说法不正确。XML中的“和”都是可以接受的,并且W3C验证程序接受带有单引号属性的XHTML文档。也许这与XHTML消除了HTML中合法的未引号属性有些混淆?
Doug McClean

除非您将页面用作text / xhtml而不是text / html浏览器会将其呈现为HTML,否则将适用HTML规则。不管怎样,关于w3C的原则之一是不要破坏网络。因为它现在可以工作,所以明天可能会工作。
Diodeus-James MacFarlane,

8
XHTML要求页面必须是格式正确的XML,而XML允许在属性周围使用双引号或单引号。
Ned Batchelder

@SoftwareMonkey实际上,您需要application/xhtml+xmlapplication/xml
rink.attendant.13年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.