SORU
8 Mart 2010, PAZARTESİ


Nasıl HTML ayrıştırır onlar ise're regexp kullanarak çalışır?

Sorular her gün veya bazı HTML dize gelen bir şey ayrıştırma ayıklamak için nasıl soran ve yorum her zaman "HTML ayrıştırmak için normal ifade kullanma, gazabı hissediyorum!" diye/ilk cevap görüyorum son kısmı bazen atlandı).

Bu benim için oldukça kafa karıştırıcı, ben her zaman genel olarak, herhangi bir karmaşık dize ayrıştırmak için en iyi yolu düzenli bir ifade kullanmak olduğunu düşündüm. Nasıl bir HTML ayrıştırıcı çalışıyor? Bunu ayrıştırmak için normal ifadeler kullanmaz.

Düzenli ifade kullanarak bir argüman her zaman bir ayrıştırma alternatif (DOMDocument evrensel olarak kullanılabilir bir seçenek değil JavaScript gibi) yok. DV örneğin, iyi DOM için bir HTML dize dönüştürmek için bir düzenli ifade kullanarak yönetmek gibi görünüyor.

Emin değilim ya bu CW için olsun ya da olmasın, cevap olmak istiyorum gerçek bir soru ve gerçekten bir tartışma iplik amacı değildir.

CEVAP
8 Mart 2010, PAZARTESİ


Nasıl bir HTML ayrıştırıcı çalışıyor? Düzenli ifadeler ayrıştırma değil mi?

Şey, hayır.

Eğer ulaşana geri beynine bir teori hesaplama ders, eğer aldın yoksa Derleyiciler dersin, ya da ona benzer bir şey olabilir hatırlama var, farklı diller ve hesaplama modelleri. Tüm ayrıntıları girmek için nitelikli değilim, ama önemli noktaları bir kaç inceleme yapabilirim.

Dil ve hesaplama (bu amaçlar için) basit tip düzenli bir dildir. Bu düzenli ifadeler ile oluşturulabilir, ve Sonlu otomata ile tanıdı. Temelde, "bu dili devlet, ancak yardımcı olmayan bellek. kullanılan" dizeleri ayrıştırma anlamına gelir HTML kesinlikle sıradan bir dil değildir. Eğer düşünürsen, etiketlerden keyfi iç içe olabilir. Örneğin, tablo içerebilir ve her bir tablo, iç içe geçmiş etiketleri taşırlar. Düzenli ifadeler ile, etiketleri bir çift ortaya çıkarmak için mümkün olabilir, ama kesinlikle bir şey keyfi olarak iç içe geçmiş.

Normal olmayan klasik basit bir dili doğru eşleşen parantez. İstediğin kadar dene, her zaman çalışacak bir düzenli ifade (veya sonlu otomat) inşa etmek mümkün olacak. Bellek yuva derinliği takip etmek gerekir.

Bellek için bir yığın devlet makine bilgisayar modeli bir sonraki gücüdür. Bu itme-aşağı bir otomat denir, ve diller, bağlamdan gramerleri tarafından oluşturulan tanır. Burada, doğru eşleşen--gerçekten de, bir yığın için mükemmel bir bellek modeli olduğunu da kabul edebiliriz.

Peki, HTML için bu yeterli mi? Ne yazık ki, Hayır. Belki de tüm etiketleri her zaman mükemmel bir şekilde sıraya super-duper dikkatle doğrulanmış XML için, aslında. Gerçek dünya, HTML, kolayca <b><i>wow!</b></i> gibi parçacıkları bulabilirsiniz. Bu tabii ki bir yuva değil, doğru ayrıştırmak için, bir yığın yeterince güçlü değil.

Hesaplama bir sonraki seviyeye dil genel gramer tarafından oluşturulur, ve Turing makineleri tarafından tanınan. Bu genellikle en güçlü hesaplama modeli var devlet bir makine, her yerde değiştirilebilir olan yardımcı bellek ile ... etkili olarak kabul ediliyor. Bu programlama dilleri ne yapabilirim. Bu HTML yaşadığı karmaşıklık düzeyi.

Genel HTML ayrıştırmak için, gerçek bir programlama dili, normal bir ifade değil. burada her şey tek bir cümleyle özetlemek gerekirse:

HTML diğer dillere ayrıştırıldı aynı şekilde ayrıştırılır: lexing ve ayrıştırma. Lexing adım anlamlı simgeleri tek tek karakter akışı bozulur. Ayrıştırma adım hareket olabilir mantıksal olarak tutarlı bir belgeye belirteçleri, devletler ve bellek kullanarak, montajını yapar.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • We've moved!

    We've moved!

    7 Ocak 2008
  • Kindness

    Kindness

    23 Ocak 2006
  • Valdorsha

    Valdorsha

    8 Mayıs 2006