Istnieją wymyślne rozwiązania polegające na wykorzystaniu samej przeglądarki do próby przeanalizowania tekstu i stwierdzenia, czy zostały zbudowane jakiekolwiek węzły DOM, co będzie… powolne. Albo wyrażenia regularne, które będą szybsze, ale… potencjalnie niedokładne. Z tego problemu wynikają również dwa bardzo różne pytania:
P1: Czy ciąg zawiera fragmenty HTML?
Czy ciąg znaków jest częścią dokumentu HTML, zawierającego znaczniki elementu HTML lub zakodowane encje? Może to służyć jako wskaźnik, że ciąg może wymagać wybielania / odkażania lub dekodowania jednostki:
/</?[a-z][^>]*>|(\&(?:[\w\d]+|#\d+|#x[a-f\d]+);/
Możesz zobaczyć ten wzorzec w użyciu we wszystkich przykładach ze wszystkich istniejących odpowiedzi w czasie tego pisania, a także trochę… raczej ohydny przykładowy tekst wygenerowany w trybie WYSIWYG lub Word i różne odniesienia do jednostek znakowych.
P2: Czy ciąg znaków jest dokumentem HTML?
Specyfikacja HTML jest szokująco luźna, jeśli chodzi o to, co uważa za dokument HTML . Przeglądarki robią wszystko, co w ich mocy, aby przeanalizować prawie każdy śmieciowy tekst jako HTML. Dwa podejścia: albo po prostu weź pod uwagę wszystko HTML (ponieważ jeśli zostanie dostarczony z text/html
typem treści, włożony zostanie duży wysiłek, aby spróbować zinterpretować go jako HTML przez klienta użytkownika) lub poszukaj znacznika prefiksu:
<!DOCTYPE html>
Jeśli chodzi o „uformowanie”, to i prawie nic więcej nie jest „wymagane”. Poniżej znajduje się w 100% kompletny, w pełni poprawny dokument HTML zawierający każdy element HTML, który Twoim zdaniem jest pomijany:
<!DOCTYPE html>
<title>Yes, really.</title>
<p>This is everything you need.
Tak. Istnieją wyraźne zasady, jak tworzyć „brakujących” elementów, takich jak <html>
, <head>
i <body>
. Chociaż wydaje mi się raczej zabawne, że podświetlanie składni SO nie wykryło tego poprawnie bez wyraźnej wskazówki.