Html Tag Kontrolü
Veri Yapıları dersinde ödev olarak stack yapısını kullanarak html taglarını kontrol ettirmemiz istendi. Burada kontrol edilecek şey açılan tag’ın yerinde kapatılıp kapatılmamasıydı. Ödev kontrol edilirken kapanmayan taglardan <br>, <br/> ve <img> tagları kullanılacağı belirtilmişti.
Html kodunu kontrol ederken izlediğim adımlar:
1-) Her satırda sadece bir tag olacak şekilde alt alta dizilmesi. 2-) Attribute bulunan taglardaki attribute’lerin kesilmesi. 3-) Tag’larin attribute’siz bir şekilde stack’e atılması. 4-) Stack’ten iki tag’in pop edilip birbirini kapatan taglar olup olmadığının kontrolü.
İzlediğim adımlar yukarıdaki gibi olsa da her adım birbirinin içinde gerçekleşiyor. Şöyle ki, dosyanın içinde bulunan bir satırı okuduk diyelim. Bir tane string tipinde temp değeri tanımladım. ‘<’ karakterini görünce temp değişkeniyle toplamaya başla ‘>’ karakterine kadar. Sonra temp’teki tag’in attribute’ini keserek stack’e at. Temp’e boş string ata. Satırın sonuna kadar bu şekilde devam et. Eğer satır ‘>’ karakteriyle bitiyorsa normal olarak aynı işleme devam ediyor ama satır ‘>’ karakteriyle bitmiyorsa temp değerine boş string atamadan alt satırdaki ‘>’ karakterine kadar alıyor ve attribute’ini keserek stack’e atıyor. Attıktan sonra stack’ten iki tane tag’i pop edip ilk çıkan tag’in ‘/’ karakterini boş string ile replace yaptıktan sonra iki etiket birbirine eşit ise devam ediyor, eşit değil ise stack’e geri gönderiyor. Eğer stack’te tag kalmazsa html kodu geçerlidir, stack’te tag kaldıysa html kodu geçersizdir.
Attribute’leri kesmek için yazdığım metod
public string CutAttribute(string tag) //taglarin Attribute'lerini kesmek için
{
string temp;
int startIndex;
int length;
if (tag.Contains(" ")) // tag'da boşluk varsa
{
startIndex = tag.IndexOf(" "); // tag ile attribute arasındaki boşluk karakterinin indexi
length = tag.IndexOf(">") - startIndex; // attribute uzunluğunu hesaplanması
temp = tag.Substring(startIndex, length); // attrubute kısmının tempe atılması
tag = tag.Replace(temp, ""); // attribute'in yerine boş karakter
}
return tag;
}
Bu metod içine her hangi bir tag’i alır. Bu tag içinde boşluk karakteri yoksa tag’i olduğu gibi döndürür. Çünkü attribute yoktur. Eğer boşluk karakteri varsa attribute var demektir. İlk önce startIndex’e ilk boşluk değerinin index’ini atadım. Sonra uzunluğu bulmak için ‘>’ karakterinin index’inden startIndex’i çıkardım. String bir değişken olan temp’e tag’daki boşluk karakterinden başlayarak attribute uzunluğu kadar olan stringi atadım. Temp’e attribute kısmı atanmış oldu. Son olarak, tag değişkenine tag’daki temp string’i olan yeri boş stringle replace yaparak atadım. Böylelikle attribute kısmı silinmiş oldu.
Sözel olarak anlatmaya çalıştım ama kodları incelerseniz daha açıklayıcı olacaktır.
Kodlara erişmek için: http://bit.ly/1M9szAu