单引号和双引号在HTML属性值中一起使用?

6
我们有这样一段代码:
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()已足够)? - ComFreek
你也可以使用数字字符引用来代替实体引用。 - Gumbo
@Gumbo 为了更好的混淆 :) - ComFreek
你混淆了HTML字符转义和PHP字符转义。它们彼此是独立的。但是,如果你使用PHP输出HTML,你首先需要知道如何编写HTML,然后需要知道如何将其转换为PHP。你的问题是关于哪个部分的?如果你分享一下,那么给你一个有见地的答案应该很容易。 - hakre
htmlspecialchars()是在输出到HTML上下文时消毒不受信任的数据的正确方法。您不使用它的原因是什么? - Fabrício Matté
显示剩余3条评论
2个回答

11
有没有一种方法可以不使用 HTML 实体(如 &quot;)、htmlentities() 或类似函数来解决呢?
答案是否定的。双引号 (")在 HTML 属性中有特殊含义。如果你要将它放入属性值中,你必须(这不是真正的必须,但是这是一个很好的经验法则。如果你像在问题中一样使用由双引号分隔的属性,则必须这样做)使用实体 &quot; 来表示。这是无法规避的。
实际上,甚至 <tag attr='this"'> 也不算错误的 HTML,大多数浏览器都可以处理。但是,这并没有帮助你,因为你要找的是单引号和双引号的组合,而在 HTML 中,其中一个永远是属性值的分隔符——如果你需要属性值内有空格的话(就像你在问题中一样)。
然而,不用担心这个问题。这样做可行,你可以用它来表达任何你想要的东西,包括你所需的引号组合。
实际上,PHP 可以通过 htmlspecialchars 方法为你消除所有那些字符转义的负担。在 PHP 字符串内,你可以直接使用原始文本——包括单引号和双引号——而不用对其进行任何特殊处理。
$myString = 'She said: "I don\'t know."';
printf('<input type="text" name="myInput" value="%s" />'
       , htmlspecialchars($myString));

这只是一个简短的例子,演示了这个如何工作。 在线演示


1
<tag attr='this"'> 是有效的 HTML。同样,根据 W3C 验证器,<input value="<>'"> 也是有效的 HTML。 - Fabrício Matté
对于 HTML 4 中的 SGML 参考文献:http://www.w3.org/TR/REC-html40/intro/sgmltut.html#h-3.2.2 - SGML 更加复杂,这就是 HTML 仅使用其子集的原因。我认为此处所述的必需内容非常适合 OP 的问题背景,但不是说你错误了。 - hakre
好的,你提供的链接规范中写道:“当属性值由双引号标记分隔时,可以在属性值内包含单引号,反之亦然。”因此,在HTML4下似乎也是有效的。 - Fabrício Matté
是的,我的回答中有错误,我现在已经修正了 :D 我认为在 SGML 中有一个例外,但没有找到它。你也会在 HTML 2 规范中找到类似的内容,实际上应该是安全的使用,但这里 OP 想要同时使用引号类型和空格,这是不可能完全按原样做的,因为 HTML 将不再可解析(即使从技术上讲,它是模棱两可的)。 - hakre
是的,我也注意到了你更新的答案,非常清晰。=] - Fabrício Matté
显示剩余7条评论

0

回答标题中的问题,使用“和'在属性值中没有问题。问题出现在值的线性化上,即将它们写入HTML标记中(与使用客户端JavaScript生成相反)。然后,如果值同时包含“和',则需要转义其中之一,具体取决于您用作值分隔符的哪个字符。

您不需要使用实体引用。也可以使用字符引用&#x22;&#x27;(或等效的十进制引用)。

对于字符串

她说:“我不知道。”

正确的英语拼写是

她说:“I don't know.”

使用正确的标点符号,不会出现标记问题,因为您可以使用Ascii引号“或Ascii撇号作为分隔符。它们用于计算机语言,而不是人类语言。


“'” 不是我需要的字符。 我正在尝试使用单引号。 - Programmer.zip
有没有带有 的键盘布局?我还没有见过。我的 en-US 键盘只有 '´ - Fabrício Matté
@程序员.zip,如果你的示例是真实的,那么你需要使用' - Jukka K. Korpela
@FabrícioMatté,是的,例如芬兰标准键盘布局。但这并不是真正相关的;即使键盘布局没有直接输入它的方式,总有一些方法可以输入正确的字符。 - Jukka K. Korpela
@JukkaK.Korpela 设置“value”属性的一个非常常见的用例是在呈现由用户输入生成的现有数据库记录的编辑表单时。 - Fabrício Matté
显示剩余2条评论

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