HTML / XML biçimlendirme ve içeriğe ayrılmıştır. Normal ifade yalnızca sözlüksel etiket ayrıştırma işlemi yaparken kullanışlıdır. Sanırım içeriği çıkarabilirsin. Bir SAX ayrıştırıcı için iyi bir seçim olacaktır. Etiketler ve içerik, öğelerin iç içe yerleştirilmesinin / kapatılmasının takip edilebildiği kullanıcı tanımlı bir işleve iletilebilir.
Etiketleri ayrıştırmakla birlikte, normal ifade ile yapılabilir ve bir belgedeki etiketleri çıkarmak için kullanılabilir.
Yıllarca süren testlerde, tarayıcıların etiketleri iyi ayrıştırmalarının ve kötü şekillendirilmesinin sırrını buldum.
Normal elemanlar bu formla ayrıştırılır:
Bu etiketlerin çekirdeği bu normal ifadeyi kullanıyor
(?:
" [\S\s]*? "
| ' [\S\s]*? '
| [^>]?
)+
Bunu [^>]?
alternatiflerden biri olarak göreceksiniz . Bu, kötü biçimlendirilmiş etiketlerdeki dengesiz tekliflerle eşleşir.
Aynı zamanda, tüm kötülüklerin düzenli ifadelere tek köküdür . Kullanılma şekli, açgözlü, eşleşmesi gereken nicelikli kabı karşılamak için bir çarpma tetikleyecektir.
Pasif olarak kullanılırsa, asla bir sorun yoktur. Ancak, bir şeyi istenen bir özellik / değer çifti ile serpiştirerek eşleştirmeye zorlarsanız ve geri izlemeye karşı yeterli koruma sağlamazsanız, bu kontrolden çıkmış bir kabus olur.
Bu sadece düz eski etiketler için genel formdur. Uyarı [\w:]
etiket adı temsil eden? Gerçekte, etiket adını temsil eden yasal karakterler Unicode karakterlerin inanılmaz bir listesidir.
<
(?:
[\w:]+
\s+
(?:
" [\S\s]*? "
| ' [\S\s]*? '
| [^>]?
)+
\s* /?
)
>
Devam ederken, TÜM etiketleri ayrıştırmadan belirli bir etiketi arayamayacağınızı da görüyoruz . Demek istediğim, ama (* SKIP) (* FAIL) gibi fiillerin bir kombinasyonunu kullanmak zorunda kalacaktı, ancak yine de tüm etiketler ayrıştırılmalıdır.
Bunun nedeni, etiket sözdiziminin diğer etiketlerin vb. İçine gizlenmiş olabilmesidir.
Bu nedenle, tüm etiketleri pasif olarak ayrıştırmak için aşağıdaki gibi bir normal ifadeye ihtiyaç vardır. Bu özel içerik de görünmez içerikle eşleşiyor .
Yeni HTML veya xml veya başka herhangi bir yeni yapı geliştirdikçe, alternatiflerden biri olarak ekleyin.
Web sayfası notu - Hiç sorun yaşamadığım bir web sayfası (veya xhtml / xml) görmedim
. Birini bulursan bana haber ver.
Performans notu - Hızlı. Bu gördüğüm en hızlı etiket ayrıştırıcısıdır
(daha hızlı olabilir, kim bilir).
Birkaç özel versiyonum var. Ayrıca kazıyıcı olarak mükemmeldir
(eğer el tipi iseniz).
Tam ham regex
<(?:(?:(?:(script|style|object|embed|applet|noframes|noscript|noembed)(?:\s+(?>"[\S\s]*?"|'[\S\s]*?'|(?:(?!/>)[^>])?)+)?\s*>)[\S\s]*?</\1\s*(?=>))|(?:/?[\w:]+\s*/?)|(?:[\w:]+\s+(?:"[\S\s]*?"|'[\S\s]*?'|[^>]?)+\s*/?)|\?[\S\s]*?\?|(?:!(?:(?:DOCTYPE[\S\s]*?)|(?:\[CDATA\[[\S\s]*?\]\])|(?:--[\S\s]*?--)|(?:ATTLIST[\S\s]*?)|(?:ENTITY[\S\s]*?)|(?:ELEMENT[\S\s]*?))))>
Biçimlendirilmiş görünüm
<
(?:
(?:
(?:
# Invisible content; end tag req'd
( # (1 start)
script
| style
| object
| embed
| applet
| noframes
| noscript
| noembed
) # (1 end)
(?:
\s+
(?>
" [\S\s]*? "
| ' [\S\s]*? '
| (?:
(?! /> )
[^>]
)?
)+
)?
\s* >
)
[\S\s]*? </ \1 \s*
(?= > )
)
| (?: /? [\w:]+ \s* /? )
| (?:
[\w:]+
\s+
(?:
" [\S\s]*? "
| ' [\S\s]*? '
| [^>]?
)+
\s* /?
)
| \? [\S\s]*? \?
| (?:
!
(?:
(?: DOCTYPE [\S\s]*? )
| (?: \[CDATA\[ [\S\s]*? \]\] )
| (?: -- [\S\s]*? -- )
| (?: ATTLIST [\S\s]*? )
| (?: ENTITY [\S\s]*? )
| (?: ELEMENT [\S\s]*? )
)
)
)
>