Napisałem małą funkcję, która to robi. To tylko ucieka "
, &
, <
i >
(ale zwykle to wszystko, czego potrzeba w każdym razie). Jest nieco bardziej elegancki niż wcześniej proponowane rozwiązania, ponieważ używa tylko jednego .replace()
do przeprowadzenia całej konwersji. ( EDYCJA 2: Zmniejszona złożoność kodu sprawia, że funkcja jest jeszcze mniejsza i bardziej uporządkowana, jeśli jesteś ciekawy oryginalnego kodu, zobacz koniec tej odpowiedzi).
function escapeHtml(text) {
'use strict';
return text.replace(/[\"&<>]/g, function (a) {
return { '"': '"', '&': '&', '<': '<', '>': '>' }[a];
});
}
To jest zwykły Javascript, bez użycia jQuery.
Ucieczki /
i '
zbyt
Edytuj w odpowiedzi na komentarz mklement .
Powyższą funkcję można łatwo rozszerzyć o dowolny znak. Aby określić więcej znaków do ucieczki, wystarczy wstawić je zarówno do klasy znaków w wyrażeniu regularnym (tj. Wewnątrz /[...]/g
), jak i jako wpis w chr
obiekcie. ( EDYCJA 2: ten sam sposób również skróciłem tę funkcję.)
function escapeHtml(text) {
'use strict';
return text.replace(/[\"&'\/<>]/g, function (a) {
return {
'"': '"', '&': '&', "'": ''',
'/': '/', '<': '<', '>': '>'
}[a];
});
}
Zwróć uwagę na powyższe użycie '
apostrofu ( '
zamiast tego można było użyć bytu symbolicznego - jest on zdefiniowany w XML, ale pierwotnie nie był uwzględniony w specyfikacji HTML i dlatego może nie być obsługiwany przez wszystkie przeglądarki. Zobacz: Artykuł w Wikipedii na temat kodowania znaków HTML ). Pamiętam też, że czytałem gdzieś, że używanie elementów dziesiętnych jest szerzej obsługiwane niż szesnastkowe, ale nie mogę teraz znaleźć źródła tego. (I nie może istnieć wiele przeglądarek, które nie obsługują bytów szesnastkowych.)
Uwaga: Dodawanie /
i '
do listy znaków ucieczki nie jest aż tak przydatne, ponieważ nie mają one specjalnego znaczenia w HTML i nie wymagają ich zmieniać.
Oryginalny escapeHtml
funkcja
EDYCJA 2: Oryginalna funkcja używała zmiennej ( chr
) do przechowywania obiektu potrzebnego do .replace()
wywołania zwrotnego. Ta zmienna wymagała także dodatkowej anonimowej funkcji do jej objęcia zasięgiem, dzięki czemu funkcja (niepotrzebnie) jest nieco większa i bardziej złożona.
var escapeHtml = (function () {
'use strict';
var chr = { '"': '"', '&': '&', '<': '<', '>': '>' };
return function (text) {
return text.replace(/[\"&<>]/g, function (a) { return chr[a]; });
};
}());
Nie testowałem, która z dwóch wersji jest szybsza. Jeśli tak, możesz dodać tutaj informacje i linki na ten temat.