如何正确转义html属性中的引号?

Chr*_*ris 239 html xhtml escaping

我在网页上有一个下拉列表,当值字符串包含引号时,它会断开.

值是"asd但在DOM中始终显示为空字符串.

我已经尝试过各种我认识的方法来正确地逃避弦乐但无济于事.

<option value=""asd">test</option>
<option value="\"asd">test</option>
<option value="&quot;asd">test</option>
<option value="&#34;asd">test</option>
Run Code Online (Sandbox Code Playgroud)

知道如何在页面上呈现这一点,以便回发消息包含正确的值吗?

And*_*y E 318

&quot; 是正确的方法,第三个测试:

<option value="&quot;asd">test</option>
Run Code Online (Sandbox Code Playgroud)

你可以在下面看到这个,或者在jsFiddle看到.

alert($("option")[0].value);
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select>
  <option value="&quot;asd">Test</option>
</select>
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用单引号分隔属性值:

<option value='"asd'>test</option>
Run Code Online (Sandbox Code Playgroud)

  • @atk:是的,````映射到与'&#34;`相同的字符,但这里使用数字选项没有任何好处,因为````是一个已定义的命名实体.```也更容易记住. (35认同)
  • OP的第四个选项&#34;也是一种逃避报价的有效方法.使用数字html实体而不是命名实体有一个好处,因为命名实体不包括所有字符,而数字实体则包含所有字符.完整的HTML4列表位于http://www.w3.org/TR/html4/sgml/entities.html. (16认同)
  • 我同意.在这种特殊情况下,它更容易使用".我只打算指出一般情况. (5认同)
  • @SIDU:将其更改为`&amp; quot; a`(将`&`替换为`&amp;`) (4认同)
  • ^无限循环 (4认同)

Luk*_*ski 15

如果您使用的是PHP,请尝试调用htmlentitieshtmlspecialchars运行.

  • 这些功能存在问题:http://wonko.com/post/html-escaping (7认同)
  • 仅使用它们可能还不够,请尝试 ```&lt;option value='&lt;?php echo htmlentities("' onmouseover='alert(123);' foo='"); ?&gt;' /&gt;``` - 确保将它与 ENT_QUOTES 一起使用,这是安全的: ```&lt;option value='&lt;?php echo htmlentities("' onmouseover='alert(123);' foo='" , ENT_QUOTES); ?&gt;' /&gt;``` ,但除了 ENT_QUOTES 之外,您还应该添加 ENT_SUBSTITUTE 和 ENT_DISALLOWED,我个人已经使用这个包装器很多年了: ```function hhb_tohtml(string $str):string { return htmlentities($str , ENT_QUOTES | ENT_HTML401 | ENT_SUBSTITUTE | ENT_DISALLOWED, 'UTF-8', true); }``` (2认同)

aij*_*aij 9

根据HTML语法,甚至HTML5,以下都是有效的选项:

<option value="&quot;asd">test</option>
<option value="&#34;asd">test</option>
<option value='"asd'>test</option>
<option value='&quot;asd'>test</option>
<option value='&#34;asd'>test</option>
<option value=&quot;asd>test</option>
<option value=&#34;asd>test</option>
Run Code Online (Sandbox Code Playgroud)

请注意,如果您使用的是XML语法,则需要引号(单引号或双引号).

这是一个显示以上所有工作的jsfiddle.


cso*_*maz 7

另一个选择是用单引号替换双引号,如果你不介意它是什么.但我没有提到这个:

<option value='"asd'>test</option>
Run Code Online (Sandbox Code Playgroud)

我提到这个:

<option value="'asd">test</option>
Run Code Online (Sandbox Code Playgroud)

就我而言,我使用了这个解决方案.

  • 但如果值包含单引号和双引号,则会失败 (9认同)