2012-05-14 169 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