2012-05-14 11 views
6

Wiem, że istnieją inne sposoby na uniknięcie tylko pojedyncze cytaty (such as this answer), ale wydaje mi się, że powinien być sposób za pomocą htmlspecialchars().Uciec tylko pojedyncze cytaty (zostaw podwójne cytaty sam) z htmlspecialchars()

Zgodnie z instrukcją, powinno to być połączenie ich stałych, ale na podstawie ich objaśnień nie widzę tego.

Czy można uciec tylko pojedynczym cudzysłowom, pozostawiając pojedyncze cudzysłowy z numerem htmlspecialchars()?

+4

Dlaczego tego potrzebujesz? Wydaje mi się, że jest to dla mnie problem. – Halcyon

+1

jeśli to tylko pojedyncze cytaty, a następnie użyj str_replace –

+0

[This] (http://www.php.net/manual/en/function.htmlspecialchars.php#99185) może pomóc –

Odpowiedz

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

tam.

Lub użyj ENT_QUOTES

htmlspecialchars($string, ENT_QUOTES); 
+1

Poważnie wątpię, że '\ '' to zamierzony zamienny ciąg znaków, jeśli celem jest umieszczenie go w dokumencie HTML. – hvd

+0

Jeśli próbuje uciec pojedynczym cudzysłowom, byłby to zamierzony ciąg znaków. – Norse

+1

Wyskakiwanie pojedynczych cudzysłowów, aby umieścić je w elemencie '' '-delimited attribute 'oznacza zmianę ich na' ' '(lub odpowiednik, jeśli istnieje odpowiednik - nie jestem pewien).Twoja druga sugestia, 'ENT_QUOTES', również konwertuje znaki podwójnego cudzysłowu, które to pytanie prosi, aby odejść sam. – hvd

1

Stosować htmlspecialchars (...)

Następnie str_replace (...) na podwójny cudzysłów

9

Oto kombinacja stałych, których szukasz.

$escaped_string = htmlspecialchars($string, ENT_QUOTES & ~ENT_COMPAT, $encoding); 

to ujdzie & ' < >, ale pozostawia " sam. ENT_QUOTES & ~ENT_COMPAT to język manipulacji bitami oznaczający "oba cytaty, pomijając podwójne cudzysłowy".

Działa to ze względu na sposób definiowania tych stałych. 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 

Dlaczego byś kiedykolwiek chcą uciec apostrofów, ale nie cudzysłowy? Cóż, odwrotna przyczyna, dla której chcesz uniknąć podwójnych cudzysłowów, ale nie pojedynczych cudzysłowów: ponieważ masz ciąg z wieloma cudzysłowami " i tylko kilkoma pojedynczymi cytatami ', więc chcesz umieścić go w ' -delimited ciąg.

Przykład:

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

json_encode() tworzy wiele cudzysłów, więc ma to sens, aby trzymać wynik w apostrofu ograniczonej atrybutu i pozostawić podwójne cytaty Niecytowany.

+0

Wiem, że to stare i zamknięte pytanie, ale nigdzie nie mogłem znaleźć odpowiedzi na oryginalne pytanie, więc zdecydowałem się opublikować jedno. – Grilse

+0

To powinna być odpowiedź. Wolę 'ENT_HTML5 | ENT_QUOTES i ~ ENT_COMPAT'. – Isius