2012-05-14 144 views
6

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

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

是否有可能只转义单引号,留下双引号,htmlspecialchars()

+4

为什么你需要这个?这对我来说似乎是个问题。 – Halcyon

+1

如果它只是单引号,然后使用str_replace –

+0

[This](http://www.php.net/manual/en/function.htmlspecialchars.php#99185)可能有帮助 –

回答

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

有。

或者,使用ENT_QUOTES

htmlspecialchars($string, ENT_QUOTES); 
+1

如果目标是把它放在一个HTML文档中,我真的怀疑'\''是否是预期的替换字符串。 – hvd

+0

如果他试图逃避单引号,那将是预期的字符串。 – Norse

+1

将单引号转义为“-delimited”属性意味着将它们更改为“'”(或等价物,如果存在等价物 - 我不确定)。您的其他建议ENT_QUOTES也会转换双引号字符,问题会单独提出。 – hvd

1

使用用htmlspecialchars(...)

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

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 

为什么你想逃避单引号,但没有双引号?那么,你可以避免双引号的原因,但不是单引号:因为你有一个字符串有很多的"双引号和只有几个'单引号,所以你想要坚持它在一个' -defined字符串。

一个例子:

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

json_encode()产生大量的双引号的,所以是有意义的坚持在一个单引号分隔属性的结果,并保留双引号转义。

+0

我知道这是一个古老而封闭的问题,但我无法在任何地方找到原始问题的答案,所以我决定发布一个问题。 – Grilse

+0

这应该是答案。我更喜欢'ENT_HTML5 | ENT_QUOTES&〜ENT_COMPAT'我自己。 – Isius