Piszę rozszerzenie Chrome, która polega robi wiele z następujących stanowisk: odkażające łańcuchów, które mogą zawierać znaczniki HTML, konwertując <
, >
i &
do <
, >
i &
, odpowiednio.
(Innymi słowy, to samo, co PHP htmlspecialchars(str, ENT_NOQUOTES)
- nie sądzę, aby istniała potrzeba konwertowania znaków podwójnego cudzysłowu).
To najszybsza funkcja, jaką do tej pory znalazłem:
function safe_tags(str) {
return str.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>') ;
}
Ale wciąż jest duże opóźnienie, kiedy muszę przepuścić kilka tysięcy strun za jednym razem.
Czy ktoś może to poprawić? Dotyczy to głównie łańcuchów zawierających od 10 do 150 znaków, jeśli to robi różnicę.
(Jeden pomysł, jaki miałem, to nie zawracać sobie głowy kodowaniem znaku większego niż - czy byłoby z tym jakieś realne niebezpieczeństwo?)
javascript
html
regex
performance
string
callum
źródło
źródło
Odpowiedzi:
Możesz spróbować przekazać funkcję zwrotną, aby wykonać zamianę:
Oto test wydajności: http://jsperf.com/encode-html-entities do porównania z
replace
wielokrotnym wywoływaniem funkcji i przy użyciu metody DOM zaproponowanej przez Dmitrija.Twoja droga wydaje się szybsza ...
Dlaczego jednak tego potrzebujesz?
źródło
>
.if (/[<>&"]/.test(str) { ... }
>
jest znakiem specjalnym w HTML, więc ucieknij przed nim. Proste. :)>
wymianę, przyspieszy to.Oto jeden sposób, w jaki możesz to zrobić:
Oto demo.
źródło
Metoda Martijna jako funkcja prototypowa:
źródło
String
tego, że powinno to być escapeHtml, ponieważ ogólnie nie jest to znak ucieczki dla String. Zgadza sięString.escapeHtml
, aleString.escape
nasuwa pytanie „po co uciec?”Jeszcze szybszym / krótszym rozwiązaniem jest:
Jest to związane z pewnym dziwnym śladem JavaScript, w którym element Option zachowuje konstruktor, który wykonuje tego rodzaju ucieczki automatycznie.
Kredyt dla https://github.com/jasonmoo/t.js/blob/master/t.js
źródło
Kod źródłowy AngularJS ma również wersję wewnątrz angular-sanitize.js .
źródło
Najszybszą metodą jest:
Ta metoda jest około dwa razy szybsza niż metody oparte na „zamianie”, patrz http://jsperf.com/htmlencoderegex/35 .
Źródło: https://stackoverflow.com/a/17546215/698168
źródło
Skrypt „wszystko w jednym”:
http://pastebin.com/JGCVs0Ts
źródło
źródło
Nie jestem do końca pewien co do szybkości, ale jeśli szukasz prostoty, sugerowałbym użycie funkcji ucieczki lodash / podkreślenia .
źródło
Metoda Martijna jako pojedyncza funkcja z obsługą znaku „ ( używanego w javascript ):
źródło
Dodam
XMLSerializer
do stosu. Zapewnia najszybszy wynik bez korzystania z buforowania obiektów (nie w serializatorze ani w węźle tekstowym).Dodatkową zaletą jest to, że obsługuje atrybuty, które są serializowane inaczej niż węzły tekstowe:
Możesz zobaczyć, co faktycznie zastępuje, sprawdzając specyfikację, zarówno dla węzłów tekstowych , jak i dla wartości atrybutów . Pełna dokumentacja zawiera więcej typów węzłów, ale koncepcja jest taka sama.
Jeśli chodzi o wydajność, jest najszybszy, gdy nie jest buforowany. Jeśli zezwolisz na buforowanie, wywołanie
innerHTML
elementu HTMLElement z podrzędnym węzłem tekstowym jest najszybsze. Regex byłby najwolniejszy (co udowodniono w innych komentarzach). Oczywiście XMLSerializer mógłby być szybszy na innych przeglądarkach, ale w moich (ograniczonych) testach ainnerHTML
jest najszybszy.Najszybsza pojedyncza linia:
new XMLSerializer().serializeToString(document.createTextNode(text));
Najszybszy z buforowaniem:
https://jsperf.com/htmlentityencode/1
źródło
Trochę za późno na przedstawienie, ale co jest złego w używaniu encodeURIComponent () i decodeURIComponent () ?
źródło