我知道还有其他方法可以仅转义单引号(例如这个答案),但在我看来应该有一种使用htmlspecialchars()的方法。
根据手册,它应该是它们常量的某种组合,但根据他们的解释,我没有看到它。
是否可以使用
htmlspecialchars()
仅转义单引号,而保留双引号?
社区警告:虽然从技术上来说这是可能的,但通常你不应该需要它,这意味着你很可能做错了什么。如果您的目标是输出
数据,那么您应该始终使用JavaScript
来实现此目的:json_encode()
<script>var=<?= json_encode($php_var) ?></script>
如果您需要将此 JavaScript 数据输出到 HTML 上下文中,请将其另外包装在常规
调用中(就像任何其他数据一样):htmlspecialchars()
<div data-myobject="<?= htmlspecialchars(json_encode($php_var)) ?>">
这是您正在寻找的常量组合。
$escaped_string = htmlspecialchars($string, ENT_QUOTES & ~ENT_COMPAT, $encoding);
这将逃脱
& ' < >
,但留下 "
。 ENT_QUOTES & ~ENT_COMPAT
是位操作语言,意思是“双引号,减去双引号”。
这之所以有效,是因为这些常量的定义方式。 php-src/ext/standard/html.h
#define ENT_HTML_QUOTE_NONE 0
#define ENT_HTML_QUOTE_SINGLE 1
#define ENT_HTML_QUOTE_DOUBLE 2
#define ENT_COMPAT ENT_HTML_QUOTE_DOUBLE
#define ENT_QUOTES (ENT_HTML_QUOTE_DOUBLE | ENT_HTML_QUOTE_SINGLE)
#define ENT_NOQUOTES ENT_HTML_QUOTE_NONE
为什么你想要转义单引号,而不是双引号?好吧,与您转义双引号而不是单引号的原因相反:因为您有一个包含大量
"
双引号和只有几个 '
单引号的字符串,所以您想要将其粘贴在 '
分隔的字符串中。
一个例子:
<div data-myobject='<?= htmlspecialchars(json_encode($myobject), ENT_QUOTES & ~ENT_COMPAT, 'UTF-8') ?>'
json_encode()
创建了大量双引号,因此将结果粘贴在单引号分隔的属性中并保留双引号不转义是有意义的。
str_replace("'", "\\'", $string);
那里。
或者,使用
ENT_QUOTES
htmlspecialchars($string, ENT_QUOTES);
使用 htmlspecialchars(...)
然后在双引号上使用 str_replace(...)
我遇到了同样的问题并找到了解决方案:
首先
htmlspecialchars($string, ENT_QUOTES);
然后
htmlspecialchars_decode($string);