单引号和双引号一起作为 HTML 属性值?
Posted
技术标签:
【中文标题】单引号和双引号一起作为 HTML 属性值?【英文标题】:Single and double quotes together as HTML attribute value? 【发布时间】:2013-09-11 17:42:16 【问题描述】:我们有这样的代码:
echo '<input type="text" name="myInput" value="Double " Quotes" />';
绝对不行,因为Double
之后的引号结束了值。
我们可以通过使用单引号而不是双引号来修复它。
echo '<input type="text" name="myInput" value=\'Double " Quotes\' />';
现在我想同时使用单引号和双引号作为值。它应该输出She said:"I don't know."
有没有办法不使用使用 html 实体(如 &quot;
)、htmlentities()
或类似函数来修复它?
【问题讨论】:
你为什么不想使用htmlentities()
(尽管htmlspecialchars()
在你的情况下就足够了)?
HTML 实体是在 HTML 属性 context 中放置保留字符的正确 方式。仅仅因为它经常在没有的情况下工作并不意味着它符合标准。
您也可以使用数字字符引用而不是实体引用。
@Gumbo 用于额外的混淆:)
您将 HTML 字符转义与 php 字符转义混合使用。两者都是独立的。但是如果你用 PHP 输出 HTML,你首先需要知道如何编写 HTML,然后你需要知道如何将它翻译成 PHP。关于哪一部分是您的问题?,如果您分享它,应该很容易给您一个有见地(至少对您而言)的答案。
【参考方案1】:
有没有办法不使用使用 HTML 实体(如
&quot;
)、htmlentities()
或类似函数来修复它?
不,没有。双引号 ("
) 在 HTML 属性中具有特殊含义。如果要将其放入属性值中,则必须(这不是真正的必须,而是一个好的经验法则。如果您使用双引号分隔的属性,就像您在问题中所做的那样,这是必须的)将其写为实体&quot;
。没有办法解决。
实际上即使<tag attr='this"'>
也不是错误的HTML,大多数浏览器可以 处理它。但是它对您没有帮助,因为您正在寻找两个引号 - 单引号和双引号 - 而 HTML 中的这些 always 之一是属性值的分隔符 - 如果您需要属性值内的空格(就像你一样)。
但是,不要担心。它有效,你可以用它表达你喜欢的一切,包括你拥有的引号组合。
实际上,PHP 可以让您承担“转义”所有这些字符的重任,只需使用 htmlspecialchars
方法为您完成所有工作。在 PHP 字符串中,您有原始文本 - 单引号和双引号,如您所见 - 逐字逐句。
$myString = 'She said: "I don\'t know."';
printf('<input type="text" name="myInput" value="%s" />'
, htmlspecialchars($myString));
只是一个简短的示例,应该演示它是如何工作的。 Online demo.
【讨论】:
<tag attr='this"'>
是有效的 HTML。此外,<input value="<>'">
是每个 W3C 验证器的有效 HTML。
引用的属性值'spec 仅强制该值不能包含与用于给定属性值的引用相同类型的文字引号字符。
这取决于您遵循的 SGML 规则。但这是一个很好的经验法则,您需要在 HTML 中使用 &lt;
代表 <
和 &amp;
代表 &
,以及更具体地在属性值内使用 &quot;
代表 "
。
是的,我在输出到 HTML 上下文之前执行htmlspecialchars
所有数据,只是想评论一下,至少在 HTML5 下,这些值不转义是有效的。
HTML 4 中的 SGML 参考:w3.org/TR/REC-html40/intro/sgmltut.html#h-3.2.2 - SGML 有点复杂,这就是 HTML 只使用它的一个子集的原因。 must 非常适合我所说的 OPs 问题,而不是说你错了。【参考方案2】:
为了解决标题中的问题,在属性值中同时使用 " 和 ' 没有问题。问题出现在值的线性化中,将它们写在 HTML 标记中(与使用客户端生成它们相反javascript)。然后,如果值同时包含 " 和 ',则需要对其中任何一个进行转义,具体取决于您使用哪个作为值分隔符。
不过,您不需要使用实体引用。也可以使用字符引用 &#x22;
和 &#x27;
(或等效的十进制引用)。
字符串的情况
她说:“我不知道。”
正确的英文拼写是
她说:“我不知道。”
使用正确的标点符号不会出现标记问题,因为您可以使用 Ascii 引号 " 或 Ascii 撇号作为分隔符。它们用于计算机语言,而不是人类语言。
【讨论】:
’
不是我需要的角色。我正在尝试使用单引号
有’
的键盘布局吗?我还没有看到一个。我的en-US
键盘只有'
和´
。
@Programmer.zip,如果你的例子是真实的,那么你需要’
。
@FabrícioMatté,是的,例如芬兰标准键盘布局。但这并不重要。总有一些方法可以输入正确的字符,即使键盘布局没有直接输入。
确实总有一些方法,但我怀疑这些方法是否适用于大多数情况。大多数英文键盘布局没有这样的字符,因此用户输入可能包含简单的 Ascii 撇号是很自然的。以上是关于单引号和双引号一起作为 HTML 属性值?的主要内容,如果未能解决你的问题,请参考以下文章