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

时间:2012-05-14 21:03:39

标签: php escaping htmlspecialchars

我知道还有其他方法可以转义单引号(such as this answer),但在我看来应该有一种方法可以使用htmlspecialchars()

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

是否可以仅使用单引号转义,仅使用双引号,htmlspecialchars()

3 个答案:

答案 0 :(得分:9)

str_replace("'", "\\'", $string);

或者,使用ENT_QUOTES

htmlspecialchars($string, ENT_QUOTES);

答案 1 :(得分:9)

以下是您正在寻找的常量组合。

$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()创建了大量双引号,因此将结果保留在单引号分隔属性中是有意义的,并保留双引号未转义。

答案 2 :(得分:1)

使用htmlspecialchars(...)

然后str_replace(...)在双引号