Mam pewien ciąg, dla którego chcę sprawdzić, czy jest to html, czy nie. Używam wyrażenia regularnego do tego samego, ale nie uzyskuję właściwego wyniku.
Sprawdziłem poprawność mojego wyrażenia regularnego i tutaj działa dobrze .
var htmlRegex = new RegExp("<([A-Za-z][A-Za-z0-9]*)\b[^>]*>(.*?)</\1>");
return htmlRegex.test(testString);
Oto skrzypce, ale wyrażenie regularne tam nie działa. http://jsfiddle.net/wFWtc/
Na moim komputerze kod działa poprawnie, ale w wyniku otrzymuję fałsz zamiast prawda. Czego tu brakuje?
javascript
regex
user1240679
źródło
źródło
<
i co najmniej jeden>
i nazwać go HTML, lub możesz sprawdzić, czy jest ściśle poprawny z poprawną składnią HTML lub cokolwiek pomiędzy. W najprostszych przypadkach parser HTML nie jest potrzebny.Odpowiedzi:
Lepszym wyrażeniem regularnym do sprawdzenia, czy ciąg jest w formacie HTML, jest:
Na przykład:
W rzeczywistości, to jest tak dobra, że będzie to powrót
true
do każdej struny przekazany do niego, co jest, bo każdy łańcuch jest HTML . Poważnie, nawet jeśli jest źle sformatowany lub nieprawidłowy, nadal jest to HTML.Jeśli szukasz elementów HTML, a nie zwykłego tekstu, możesz użyć czegoś takiego jak:
Nie pomoże ci to w żaden sposób przeanalizować kodu HTML, ale z pewnością oflaguje ciąg jako zawierający elementy HTML.
źródło
a < b && a > c
jest to HTML?a<b && a>c
jest to HTML ... Chciałbym, aby wykrywanie HTML mogło być tak bardzo uproszczone. Parsowanie nigdy nie jest łatwe.a < b && a > c
przeglądarki będzie włączyć>
i<
znaków na>
i<
jednostek odpowiednio. Jeśli zamiast tego użyjesza<b && a>c
przeglądarki, zinterpretuje znacznik jako,a<b && a>c</b>
ponieważ brak spacji oznacza, że<b
otwiera<b>
element. Oto krótkie demo tego, o czym mówię .Metoda nr 1 . Oto prosta funkcja do sprawdzenia, czy ciąg zawiera dane HTML:
Pomysł polega na umożliwieniu parserowi DOM przeglądarki decydowania, czy podany ciąg wygląda jak HTML, czy nie. Jak widać, po prostu sprawdza
ELEMENT_NODE
(nodeType
z 1).Zrobiłem kilka testów i wygląda na to, że działa:
To rozwiązanie poprawnie wykryje ciąg HTML, jednak ma efekt uboczny, że img / vide / etc. Tagi zaczną pobierać zasób po przeanalizowaniu w innerHTML.
Metoda nr 2 . Inna metoda wykorzystuje DOMParser i nie ma skutków ubocznych ładowania zasobów:
Uwagi:
1.
Array.from
to metoda ES2015, można ją zastąpić[].slice.call(doc.body.childNodes)
.2. Funkcję strzałki w
some
wywołaniu można zastąpić zwykłą funkcją anonimową.źródło
isHTML("</a>") --> false
.).innerHTML
, zmusi przeglądarkę do rozpoczęcia pobierania tych zasobów. :(Trochę walidacji z:
Wyszukuje puste tagi (niektóre predefiniowane) i
/
zakończone puste tagi XHTML i sprawdza jako HTML z powodu pustego tagu LUB przechwyci nazwę tagu i spróbuje znaleźć zamykający tag gdzieś w ciągu, aby zweryfikować go jako HTML.Wyjaśnione demo: http://regex101.com/r/cX0eP2
Aktualizacja:
Pełna walidacja z:
To robi właściwą walidację, ponieważ zawiera ALL znaczniki HTML, puste najpierw, a następnie pozostałe, które wymagają znacznika zamykającego.
Wyjaśnione demo tutaj: http://regex101.com/r/pE1mT5
źródło
document.querySelector('strange')
- zadziała.Powyższa odpowiedź zzzzBov jest dobra, ale nie uwzględnia przypadkowych tagów zamykających, takich jak na przykład:
Wersja, która również przechwytuje tagi zamykające, może wyglądać tak:
źródło
<[a-z/][\s\S]*>
- zwróć uwagę na ukośnik w pierwszej grupie.Oto niechlujna jedna linijka, której używam od czasu do czasu:
Zasadniczo powróci
true
do ciągów zawierających ciąg,<
po którymANYTHING
następuje>
.Mówiąc
ANYTHING
, mam na myśli w zasadzie wszystko oprócz pustego ciągu.To nie jest świetne, ale to jedna linijka.
Stosowanie
Jak widać, jest to dalekie od ideału, ale w niektórych przypadkach może wykonać pracę za Ciebie.
źródło
Wszystkie odpowiedzi tutaj są zbyt wyczerpujące, po prostu szukają,
<
a następnie>
. Nie ma idealnego sposobu na wykrycie, czy ciąg to HTML, ale możesz zrobić to lepiej.Poniżej szukamy tagów końcowych , które będą znacznie ciaśniejsze i dokładniejsze:
A oto w akcji:
źródło
Jeśli tworzysz wyrażenie regularne z literału ciągu, musisz uciec przed wszelkimi odwrotnymi ukośnikami:
Nie jest to konieczne, jeśli używasz literału wyrażenia regularnego, ale wtedy musisz pominąć ukośniki:
Również twój jsfiddle nie działał, ponieważ przypisałeś moduł
onload
obsługi w innymonload
module obsługi - domyślnym ustawieniem w panelu Frameworks & Extensions po lewej stronie jest owinięcie JS w plikonload
. Zmień to na opcję nowrap i popraw ucieczkę literału ciągu i to "działa" (w ramach ograniczeń, które każdy wskazał w komentarzach): http://jsfiddle.net/wFWtc/4/O ile wiem, wyrażenia regularne JavaScript nie mają odniesień wstecznych. Więc ta część twojego wyrażenia:nie będzie działać w JS (ale będzie działać w niektórych innych językach).źródło
<br>
<hr>
<input...>
@ user1240679?/<\/?[^>]*>/.test(str)
Wykrywaj tylko, czy zawiera tagi html, może to być xmlźródło
27 is < 42, and 96 > 42.
To nie jest HTML.Dzięki jQuery:
źródło
isHTML("<foo>");
// zwraca trueisHTML("div");
// zwraca true, jeślidiv
na stronie znajdują się@
jest prawidłową składnią selektora. Tak więc, kiedy przekażesz go do selektora jQuery, zgłosi wyjątek (np.$("[email protected]")
From!!$(str)[0]
). Mam na myśli konkretnie!!$(str)[0]
porcję. Właśnie zredagowałeś swoją odpowiedź, ale teraz sprawdzasz HTML, zanim jQuery zrobi cokolwiek.Używając jQuery w tym przypadku, najprostsza forma to:
Jeśli
$(testString).length = 1
oznacza to, że w środku znajduje się jeden tag HTMLtextStging
.źródło
$()
jest operacją selektora CSS. Ale także fabryka węzłów DOM z serializacji tekstowej HTML. Ale także… zgodnie z drugą odpowiedzią cierpiącą na tę samą zależność od jQuery, „div” nie jest HTML-em, ale zostanie zwrócony,true
jeśli<div>
na stronie istnieją jakiekolwiek elementy. Jest to bardzo, bardzo złe podejście, jak się spodziewałem w przypadku prawie każdego rozwiązania niepotrzebnie wykorzystującego jQuery. (Let it die.)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:
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: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:
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.źródło
Moje rozwiązanie to
źródło
Istnieje pakiet NPM is-html, który może próbować rozwiązać ten https://github.com/sindresorhus/is-html
źródło
<html>
i<body>
tagi, z których oba są całkowicie opcjonalne . Test „niezgodny z XML” mówi wiele.