Najwyraźniej jest to trudniejsze do znalezienia, niż myślałem. I to nawet jest takie proste ...
Czy istnieje odpowiednik funkcji htmlspecialchars PHP wbudowanej w Javascript? Wiem, że jest to dość łatwe do zaimplementowania samodzielnie, ale korzystanie z wbudowanej funkcji, jeśli jest dostępna, jest po prostu przyjemniejsze.
Dla tych, którzy nie znają PHP, htmlspecialchars tłumaczy takie rzeczy jak <htmltag/>
na<htmltag/>
Wiem o tym escape()
i encodeURI()
nie działam w ten sposób.
javascript
html
escaping
html-encode
Bart van Heukelom
źródło
źródło
Odpowiedzi:
Wystąpił problem z kodem rozwiązania - będzie on zmieniał się tylko przed pierwszym wystąpieniem każdego znaku specjalnego. Na przykład:
Oto kod, który działa poprawnie:
Aktualizacja
Poniższy kod da identyczne wyniki jak powyższy, ale działa lepiej, szczególnie w przypadku dużych bloków tekstu (dzięki jbo5112 ).
źródło
To jest kodowanie HTML. Nie ma do tego natywnej funkcji javascript, ale możesz wygooglować i uzyskać kilka ładnie wykonanych.
Np. Http://sanzon.wordpress.com/2008/05/01/neat-little-html-encoding-trick-in-javascript/
EDYCJA:
Oto, co przetestowałem:
Wynik:
<htmltag/>
źródło
encodeURIComponent
robi, a nie to, o co prosił OP. Więc czy możesz edytować? Nie mogę cofnąć mojej -1.div
element i węzeł tekstowy. Utworzenie węzła tekstowego z tekstem `<img src = bogus onerror = alert (1337)>` spowoduje po prostu utworzenie węzła tekstowego, a nieimg
elementu.Warto przeczytać: http://bigdingus.com/2007/12/29/html-escaping-in-javascript/
Uwaga : uruchom to tylko raz. I nie uruchamiaj go na już zakodowanych łańcuchach, np.
&
Staje się&amp;
źródło
Z jQuery może wyglądać tak:
Z pokrewnego pytania Escapowanie ciągów HTML za pomocą jQuery
Jak wspomniano w komentarzu, dla tej implementacji podwójne cudzysłowy i pojedyncze cudzysłowy są pozostawione bez zmian. Oznacza to, że to rozwiązanie nie powinno być używane, jeśli chcesz utworzyć atrybut elementu jako nieprzetworzony ciąg html.
źródło
<!-- Caps rage begin -->
Ta odpowiedź powinna mieć wynik UJEMNY, ponieważ NAWET NIE BLISKO ODPOWIEDZI NA PYTANIE „Odpowiednik HtmlSpecialChars”.<!-- Caps rage end -->
cytaty-jezusa-chrystusa-i-innych-bóstw-to-nie-ucieka-. OMG wy jquery people.Oto funkcja umożliwiająca ucieczkę z HTML:
I odszyfrować:
źródło
Underscore.js udostępnia do tego funkcję:
http://underscorejs.org/#escape
Nie jest to wbudowana funkcja JavaScript, ale jeśli już używasz podkreślenia, jest to lepsza alternatywa niż pisanie własnej funkcji, jeśli twoje ciągi do konwersji nie są zbyt duże.
źródło
Jeszcze innym podejściem jest całkowite zrezygnowanie z mapowania znaków i zamiast tego przekonwertowanie wszystkich niechcianych znaków na odpowiadające im odnośniki numeryczne, np .:
Zwróć uwagę, że określone wyrażenie RegEx obsługuje tylko określone znaki, z których OP chciał uciec, ale w zależności od kontekstu, w którym zostanie użyty kod HTML ze ucieczką, te znaki mogą nie być wystarczające. Artykuł Ryana Grove'a Jest więcej znaków ucieczki HTML niż &, <,> i " to dobra lektura na ten temat. W zależności od kontekstu, poniższe wyrażenie regularne może być bardzo potrzebne, aby uniknąć wstrzyknięcia XSS:
źródło
próbka:
źródło
Prawdopodobnie nie potrzebujesz takiej funkcji. Ponieważ Twój kod znajduje się już w przeglądarce *, możesz uzyskać bezpośredni dostęp do DOM zamiast generować i kodować HTML, który będzie musiał zostać zdekodowany wstecz przez przeglądarkę, aby faktycznie był używany.
Użyj
innerText
właściwości, aby bezpiecznie i znacznie szybciej wstawić zwykły tekst do DOM, niż przy użyciu którejkolwiek z przedstawionych funkcji ucieczki. Nawet szybciej niż przypisanie statycznego wstępnie zakodowanego ciągu doinnerHTML
.Służy
classList
do edycji klas,dataset
ustawianiadata-
atrybutów isetAttribute
innych.Wszystkie te poradzą sobie z ucieczką za Ciebie. Mówiąc dokładniej, nie ma potrzeby ucieczki i żadne kodowanie nie będzie wykonywane pod spodem **, ponieważ pracujesz nad HTML, tekstową reprezentacją DOM.
* Ta odpowiedź nie jest przeznaczona dla użytkowników JavaScript po stronie serwera (Node.js itp. )
** Chyba że później wyraźnie przekonwertujesz go na rzeczywisty HTML. Np. Poprzez dostęp
innerHTML
- tak się dzieje, gdy uruchamiasz$('<div/>').text(value).html();
sugerowane w innych odpowiedziach. Więc jeśli Twoim ostatecznym celem jest wstawienie pewnych danych do dokumentu, robiąc to w ten sposób, wykonasz tę pracę dwukrotnie. Możesz również zobaczyć, że w wynikowym HTML nie wszystko jest zakodowane, a jedynie minimum potrzebne do poprawności. Odbywa się to w zależności od kontekstu, dlatego ta metoda jQuery nie koduje cudzysłowów i dlatego nie powinna być używana jako eskaper ogólnego przeznaczenia. Znakowanie cudzysłowami jest potrzebne, gdy konstruujesz kod HTML jako ciąg znaków z niezaufanymi lub zawierającymi cytaty danymi w miejscu wartości atrybutu. Jeśli używasz DOM API, nie musisz w ogóle martwić się ucieczką.źródło
el.textContent = str; el.innerHTML = el.innerHTML.replace(/\n/g, '<br>')
końca linii HTML (coś w rodzaju ), albo ustawićwhite-space
właściwość CSS napre
lubpre-wrap
innerText
zamiasttextContent
. Chociaż jest nieco wolniejszy i ma kilka innych różnic podczas odczytywania właściwości, jest bardziej intuicyjny, ponieważ<br>
zastępuje automatycznie podczas przypisywania do niej.W przypadku użytkowników Node.JS (lub użytkowników korzystających ze środowiska uruchomieniowego Jade w przeglądarce) można skorzystać z funkcji ucieczki Jade.
Nie ma sensu pisać tego samemu, jeśli ktoś inny go utrzymuje. :)
źródło
Rozwijam trochę odpowiedź okw.
Możesz użyć do tego funkcji DOM przeglądarki.
To wraca
<escapeThis>&
Używa standardowej funkcji
createElement
do stworzenia niewidocznego elementu, a następnie używa funkcjitextContent
do ustawienia dowolnego ciągu jako jego zawartości, a następnieinnerHTML
do pobrania zawartości w reprezentacji HTML.źródło
źródło
Mam nadzieję, że to wygra wyścig ze względu na swoje osiągi i co najważniejsze, nie jest to łańcuchowa logika używająca .replace ('&', '&'). Replace ('<', '<') ...
źródło
Odwrócony:
źródło
<
i&gr;
w ciąg.To write a greater than sign in HTML type &gt;
:, wyświetli się niepoprawnie>
zamiast>
OWASP zaleca, aby „[e] xz wyjątkiem znaków alfanumerycznych, [powinieneś] zmienić znaczenie wszystkich znaków z wartościami ASCII mniejszymi niż 256 z
&#xHH;
formatem (lub nazwaną jednostką, jeśli jest dostępna), aby zapobiec wyłączeniu [an] atrybutu”.Oto funkcja, która to robi, na przykładzie użycia:
źródło
W rozwiązaniu tym wykorzystuje się numeryczny kod znaków,
<
zastępując np<
..Chociaż jego wydajność jest nieco gorsza od rozwiązania wykorzystującego mapę , ma zalety:
źródło