在HTML属性中使用单引号是正确的吗?

79

最近我看到很多这样的东西:

<a href='http://widget-site-example.com/example.html'>
    <img src='http://widget-site-example.com/ross.jpg' alt='Ross&#39;s Widget' />
</a>

在HTML中使用单引号是有效的吗?正如我上面所强调的,这也是有问题的,因为你必须转义撇号。


我希望这种方式能够变得流行起来!因为双引号更受欢迎,所以在JavaScript中使用单引号成为了常见的风格,因为字符串中会有很多带有双引号的HTML。现在我已经在JavaScript中键入了如此多的单引号字符串,以至于每当我使用其他语言,比如Python、C#、C++时,我都会键入单引号并得到语法错误。 - gman
16个回答

60

使用单引号是有效的(HTML 4.01,第3.2.2节)。我没有注意到这样的趋势,但也许你访问的某些网站使用了一些引用单引号的框架。


有趣的是,主要是那些提供外部代码的网站 - 例如Ohloh的统计图像或http://www.pushuptheweb.com/。 - Ross
Google字体库现在提供带有单引号的示例代码:http://www.google.com/webfonts - Simon East

48
我发现在使用双引号字符串字面量的编程语言动态生成HTML时,使用单引号很方便。
例如:
String.Format("<a href='{0}'>{1}</a>", Url, Desc)

8
什么?你不喜欢String.Format("<a href=" & ControlChars.Quote & "{0}" & ControlChars.Quote & ">{1}</a>", Url, Desc)这个方法吗?=P - StingyJack
String.Format(@"<a href=""{0}"">{1</a>}", Url, Desc) 这是你可能考虑的 :) - Nikita Ignatov
5
或者 String.Format("<a href="{0}">{1</a>}", Url, Desc) - missaghi
26
极其丑陋的三个完美例子 :) - ThiefMaster
4
这是一个很好的例子,说明如何在您的网站中创建XSS漏洞。 - Allison

12

使用 PHP 生成 HTML 时,可以更容易地执行以下操作:

$html = "<img src='$url' />";

使用双引号拼接字符串和变量比直接拼接更好,因为PHP可以解析双引号中的变量。


这也比盯着 $html = "<img src="{$url}" />"; 容易得多,因为转义引号很容易被忘记。 - Sekhat
4
实际上,您也可以在PHP中将其反转:$html = '<img src="$url" />'; - Kevin Laity
16
在PHP中使用单引号会使得变量 $url 打印出 $url,而非变量内容。具体可参考 http://php.net/manual/en/language.types.string.php。 - bradlis7
替代方案也无法使其更易读:$html = '<img src="'.$url.'" />' - JimmyMcHoover
1
我使用格式化字符串,例如 sprintf('<img src="%s" />', $url) - Koen.

5

有另一种情况需要使用单引号:在数据属性中存储JSON数据:

<tr data-info='{"test":true}'></tr>

JSON对象的键必须用双引号括起来,因此属性本身不能使用双引号。


4

有些人可能会在PHP中使用它,以避免在双引号字符串中转义“”,或者避免使用字符串连接运算符来解析其中的变量。

例如:

echo "<input type='text' value='$data'/>";

替换

echo "<input type=\"text\" value=\"$data\" />";

或者
echo '<input type="text" value="' . $data . '" />';

现在我总是使用双引号来编写 HTML,而使用单引号来编写 Javascript。

3

如果您想嵌入双引号,这将更容易。


3
如果完全颠倒情况,同样适用......因此,在我看来这不是一个好的理由。 - Joe Phillips
@JoePhillips 并非总是如此,有些语言不允许你简单地“反转场景”。例如,.NET 只允许使用双引号定义字符串。 - krowe2
@krowe2 这是真的。但是如果你把JavaScript存储在C#字符串中,那么你可能做了很多错误的事情。 - Joe Phillips
@JoePhillips 我没有提到JS,但这只是其中一个原因,而且这样做没有任何问题。一个常见的例子是为了缓存破坏。Reponse.Write(String.Format("<script src='/js/myjs.js?{0}' type=text/javascript></script>", MakeUniqueStringFun())); 这个例子如果像这样工作得很好就更好了:<script src='/js/myjs.js?<%=MakeUniqueStringFun()%>' type=text/javascript></script> 但一个并不比另一个更正确,而且显然使用后一种方法会使更长的JS片段变得难以处理。 - krowe2

3
在ASP.NET中,如果你在属性中使用数据绑定表达式,使用单引号会更容易一些。
<asp:TextBox runat="server" Text='<%# Bind("Name") %>' />

2

单引号在(X)HTML中是完全合法的。然而,使用反斜杠来转义它们是不合法的。 <img src='http://widget-site-example.com/ross.jpg' alt='Ross\'s Widget' /> 是一张带有alt文本“Ross\”以及空的sWidget/Widget'属性的图片。在HTML中正确转义撇号的方法是&#39;


1
单引号在XHTML中不是完全合法的。 - Joe Phillips
3
单引号在XHTML中是合法的吗? - Bennett McElwee

2
在PHP中,echo可以接受多个参数。因此,如果想要省略连接运算符,可以像下面这样使用双引号:
echo '<input type="text" value="', $data, '" />';

1
但是当你意识到时,你已经用双引号开始了回声字符串,所以你只能在字符串内部使用单引号。这种情况经常发生在我身上。 - DiegoDD
这也更加内存高效,因为它避免了创建新的字符串。 - Andrea
这似乎完全没有回答问题。 - krowe2

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接