使用htmlspecialchars()仅使用单引号(单独使用双引号)

Luk*_*een 6 php escaping htmlspecialchars

我知道还有其他方法只能转义单引号(比如这个答案),但在我看来应该有一种方法可以使用htmlspecialchars().

根据手册,它应该是它们常量的某种组合,但根据它们的解释,我看不到它.

有可能只逃避单引号,只留下双引号htmlspecialchars()吗?

Nor*_*rse 11

str_replace("'", "\\'", $string);
Run Code Online (Sandbox Code Playgroud)

那里.

或者,使用 ENT_QUOTES

htmlspecialchars($string, ENT_QUOTES);
Run Code Online (Sandbox Code Playgroud)


Gri*_*lse 9

这是你正在寻找的常数的组合.

$escaped_string = htmlspecialchars($string, ENT_QUOTES & ~ENT_COMPAT, $encoding);
Run Code Online (Sandbox Code Playgroud)

这将逃脱& ' < >,但一个人离开".ENT_QUOTES & ~ENT_COMPAT是位操纵语言,意思是" 两个引号,减去双引号 ".

这是因为这些常量的定义方式.PHP-SRC/EXT /标准/ 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
Run Code Online (Sandbox Code Playgroud)

为什么你想要逃避单引号,而不是双引号?好了,你逃脱双引号,而不是单引号的原因相反:因为你已经有了一个字符串,有很多的"双引号,只有少数'单引号,所以你要坚持在'-delimited串.

一个例子:

<div data-myobject='<?= htmlspecialchars(json_encode($myobject), ENT_QUOTES & ~ENT_COMPAT, 'UTF-8') ?>'
Run Code Online (Sandbox Code Playgroud)

json_encode() 创建了大量双引号,因此将结果保留在单引号分隔属性中是有意义的,并保留双引号未转义.