Sztuczka jQuery nie koduje znaków cudzysłowu, a w IE usuwa białe znaki.
W oparciu o szablon ucieczki w Django, który, jak sądzę, jest już mocno używany / przetestowany, stworzyłem tę funkcję, która robi to, co jest potrzebne.
Jest to prawdopodobnie prostsze (i być może szybsze) niż jakiekolwiek obejście problemu usuwania spacji - i koduje znaki cudzysłowu, co jest niezbędne, jeśli na przykład chcesz użyć wyniku wewnątrz wartości atrybutu.
function htmlEscape(str) {
return str
.replace(/&/g, '&')
.replace(/"/g, '"')
.replace(/'/g, ''')
.replace(/</g, '<')
.replace(/>/g, '>');
}
// I needed the opposite function today, so adding here too:
function htmlUnescape(str){
return str
.replace(/"/g, '"')
.replace(/'/g, "'")
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/&/g, '&');
}
Aktualizacja 17.06.2013:
W poszukiwaniu najszybszego ucieczki znalazłem tę implementację replaceAll
metody:
http://dumpsite.com/forum/index.php?topic=4.msg29#msg29
(również tutaj: Najszybszy metoda zamiany wszystkich wystąpień znaku w ciągu )
Niektóre wyniki wydajności tutaj:
http://jsperf.com/htmlencoderegex/25
Daje identyczny ciąg wyników do wbudowanych replace
łańcuchów powyżej. Byłbym bardzo szczęśliwy, gdyby ktoś mógł wyjaśnić, dlaczego jest to szybsze !?
Aktualizacja 2015-03-04:
Właśnie zauważyłem, że AngularJS używa dokładnie powyższej metody:
https://github.com/angular/angular.js/blob/v1.3.14/src/ngSanitize/sanitize.js#L435
Dodają kilka udoskonaleń - wydają się radzić sobie z niejasnym problemem związanym z Unicode, a także konwertować wszystkie znaki niealfanumeryczne na jednostki. Miałem wrażenie, że ten ostatni nie był konieczny, dopóki masz zestaw znaków UTF8 określony dla twojego dokumentu.
Zauważę, że (4 lata później) Django nadal nie robi żadnej z tych rzeczy, więc nie jestem pewien, jak ważne są:
https://github.com/django/django/blob/1.8b1/django/utils /html.py#L44
Aktualizacja 2016-04-06:
Możesz także chcieć uciec przed ukośnikiem /
. Nie jest to wymagane do poprawnego kodowania HTML, jednak jest zalecane przez OWASP jako środek bezpieczeństwa anty-XSS. (dzięki @JNF za sugestie w komentarzach)
.replace(/\//g, '/');