@JimMorrison:
Co Ty w ogóle chcesz zrobić? Czy na pewno nie przesadzasz? Takie parsowanie HTML-a po stronie JavaScriptu naprawdę może zakrawać na przegięcie.
No bo zobacz, co jeśli miałbyś np. taki kod?
<!--
<a>To wcale nie jest tag!</a>
-->
<a rel="przeszkadzajka >">To już jest tag</a>
Wydaje mi się, że podejście do komentarzy HTML, o którym napisałeś, może nie być poprawne. Bo komentarzy wewnątrz tagów nie ma, tzn. nie ma czegoś takiego jak:
<a href="#" <!-- komentarz > dalej komentarz la la la -->>Tekst</a>
^^O ile wiem, to nie jest poprawny HTML! Zresztą czy widziałeś kiedyś taki kod? Komentarze muszą być poza znacznikami otwierającymi i zamykającymi, nie wewnątrz nich. Więc nie musisz się przejmować, że wewnątrz taga otwierającego natrafisz na komentarz. Jeśli chciałbyś to jednak ominąć, to w tych alternatywach miej nie samą końcówkę komentarza "-->", tylko początek, dowolne znaki i końcówkę, czyli "".
Powyższa technika nie ochroni Cię jednak przed jednym -- powyższe wyrażenie regularne będzie pasowało nie tylko do tagów, ale i do komentarzy!
Możesz się przed tym zabezpieczyć wymuszając, by pierwszy znak za < nie był znakiem !. Konstrukcje typu <! ... > są w HTML-u / SGML-u zarezerwowane dla różnych rzeczy, ale nie dla tagów.
Pamiętaj też, że w pewnych przypadkach łatwo jest po prostu wywalić z tekstu komentarze za pomocą osobnego wyrażenia regularnego. Czasem musisz je zostawić, jeśli zależy Ci na wiernym odwzorowaniu kodu, ale czasem możesz sobie pozwolić na ich wywalenie. Niektóre parsery XML/XHTML tak właśnie robią. Od razu ostrzegę, że niektórzy zagnieżdżają w dokumencie skrypty i umieszczają ich kod w komentarzu HTML, "żeby się zabezpieczyć przed starymi przeglądarkami". To prastara i nonsensowna już konstrukcja. Za to jakiś parser XHTML ma prawo wywalić ten ich kod w komentarzu i w ogóle go zignorować.
JimMorrison napisał(a)
Nie wiem czy sie da jaki jest znak wczesniej np. jeśli jest znak > to sprawdzic czy wczesniejszy znak to -
Da się, przy użyciu lookbehindów. (?<=a)b dopasuje "b" wtedy i tylko wtedy, gdy jest poprzedzone przez literę "a". Z kolei (?<!c)d to negatywny lookbehind -- dopasuje d wtedy i tylko wtedy, gdy tuż przed nią NIE ma litery c. Problem w tym, że w JavaScripcie lookbehindów nie ma, są tylko lookaheady.