Jakie są różnice między htmlspecialchars()
i htmlentities()
. Kiedy powinienem użyć jednego lub drugiego?
Z dokumentacji PHP dla htmlentities :
Ta funkcja jest identyczna
htmlspecialchars()
pod każdym względem, z wyjątkiemhtmlentities()
, że wszystkie znaki, które mają odpowiedniki encji znaków HTML, są tłumaczone na te encje.
Z dokumentacji PHP dla htmlspecialchars :
Niektóre znaki mają szczególne znaczenie w HTML i powinny być reprezentowane przez jednostki HTML, jeśli mają zachować swoje znaczenie. Ta funkcja zwraca ciąg znaków z niektórymi z tych konwersji; wykonane tłumaczenia są najbardziej przydatne do codziennego programowania w Internecie. Jeśli chcesz przetłumaczyć wszystkie encje znaków HTML, użyj
htmlentities()
zamiast tego.
Różnica polega na tym, co zostanie zakodowane. Dostępne opcje to wszystko (byty) lub znaki specjalne, takie jak znak ampersand, podwójne i pojedyncze cudzysłowy, mniej niż i więcej niż (znaki specjalne).
Wolę używać, htmlspecialchars
gdy tylko jest to możliwe.
Na przykład:
echo htmlentities('<Il était une fois un être>.');
// Output: <Il était une fois un être>.
// ^^^^^^^^ ^^^^^^^
echo htmlspecialchars('<Il était une fois un être>.');
// Output: <Il était une fois un être>.
// ^ ^
htmlspecialchars()
gdy tylko jest to możliwe, oprócz oczywistych różnic? Jakie sytuacjehtmlentities()
spowodują problemy, ahtmlspecialchars()
nie?htmlentities
ihtmlspecialchars
może obsługiwać UTF-8, o ile podasz"UTF-8"
trzeci argument.htmlspecialchars
może być użyty:Gdy nie ma potrzeby kodowania wszystkich znaków, które mają swoje odpowiedniki HTML.
Jeśli wiesz, że kodowanie strony pasuje do specjalnych symboli tekstowych, dlaczego miałbyś używać
htmlentities
?htmlspecialchars
jest znacznie prostsza i produkuje mniej kodu do wysłania do klienta.Na przykład:
Drugi jest krótszy i nie powoduje żadnych problemów, jeśli ustawiony jest zestaw znaków ISO-8859-1.
Gdy dane będą przetwarzane nie tylko przez przeglądarkę (aby uniknąć dekodowania encji HTML),
Jeśli dane wyjściowe to XML (patrz odpowiedź Artefacto ).
źródło
To jest kodowane
htmlentities
.implode( "\t", array_values( get_html_translation_table( HTML_ENTITIES ) ) )
:To jest kodowane
htmlspecialchars
.implode( "\t", array_values( get_html_translation_table( HTML_SPECIALCHARS ) ) )
:źródło
Ponieważ:
htmlentities
zastępuje więcej znaków niżhtmlspecialchars
. Jest to niepotrzebne, powoduje, że skrypt PHP jest mniej wydajny, a wynikowy kod HTML mniej czytelny.htmlentities
jest konieczne tylko wtedy, gdy strony używają kodowania takiego jak ASCII lub LATIN-1 zamiast UTF-8 i jeśli dane są przetwarzane z kodowaniem innym niż strona.źródło
Powinieneś użyć,
htmlspecialchars($strText, ENT_QUOTES)
gdy chcesz, aby Twój ciąg był bezpieczny w formacie XML i HTML:Na przykład koduj
Jeśli jednak masz w tekście dodatkowe znaki, które są Unicode lub nietypowe symbole, powinieneś użyć htmlentities (), aby upewnić się, że poprawnie wyświetlają się na twojej stronie HTML.
Uwagi:
źródło
htmlspecialchars ()
wykonuje minimalną ilość kodowania, aby upewnić się, że łańcuch nie jest analizowany jako HTML. To sprawia, że Twój ciąg jest bardziej czytelny dla człowieka, niż gdybyśhtmlentities ()
kodował absolutnie wszystko, co ma kodowanie.źródło
Właśnie dowiedziałem się o
get_html_translation_table
funkcji. Zdajesz goHTML_ENTITIES
lubHTML_SPECIALCHARS
zwraca tablicę ze znakami, które zostaną zakodowane i sposób ich zakodowania.źródło
htmlentities - Konwertuj wszystkie odpowiednie znaki na encje HTML.
htmlspecialchars - Konwertuj znaki specjalne na jednostki HTML.
W tłumaczeniach wykonano tłumaczenia znaków poniżej:
Możesz sprawdzić następujący kod, aby uzyskać więcej informacji na temat htmlentities i htmlspecialchars:
https://gist.github.com/joko-wandiro/f5c935708d9c37d8940b
źródło
Prawdopodobnie chcesz użyć kodowania znaków Unicode, na przykład UTF-8 i htmlspecialchars. Ponieważ nie ma jakikolwiek potrzeba generowania „podmioty html” dla wszystkich „[w] obowiązujących znaków” (czyli co htmlentities robi zgodnie z dokumentacją) jeśli jest już w zestawie znaków.
źródło
Jeden mały przykład, musiałem mieć indeksowane 2 nazwy klientów w funkcji:
Pierwotnie,
$term = get_term_by('name', htmlentities($name), 'client');
co zaowocowało nazwami terminów, które zawierały tylko element tablicy ampersand (&), ale nie element akcentowany. Ale kiedy zmieniłem ustawienie zmiennej,htmlspecialchars
oba były w stanie uruchomić tę funkcję. Mam nadzieję że to pomoże!źródło
Różnice między htmlspecialchars () i htmlentities () są bardzo małe. Zobaczmy kilka przykładów:
htmlspecialchars (ciąg $ ciąg) przyjmuje wiele argumentów, gdzie jako pierwszy argument jest ciągiem, a wszystkie inne argumenty (niektóre flagi, niektóre kodowania itp.) są opcjonalne. htmlspecialchars konwertuje znaki specjalne w ciągu znaków na encje HTML. Na przykład, jeśli masz <br> w swoim ciągu, htmlspecialchars przekonwertuje go na & lt; b & gt; . Podczas gdy znaki takie jak µ † itp. Nie mają specjalnego znaczenia w HTML. Nie będą więc konwertowane na jednostki HTML za pomocą funkcji htmlspecialchars, jak pokazano w poniższym przykładzie.
htmlentities (string $ string) jest bardzo podobny do htmlspecialchars i przyjmuje wiele argumentów, gdzie jako pierwszy argument jest ciągiem, a wszystkie inne argumenty są opcjonalne (niektóre flagi, niektóre kodowania itp.). W przeciwieństwie htmlspecialchars , htmlentities konwertyci nie tylko znaki specjalne struny do podmiotów HTML, ale wszystkie stosowane postacie do podmiotów HTML.
źródło
https://dev.w3.org/html5/html-author/charref
Nie w pełni, proszę śledzić link do pełnego dokumentu.
źródło