Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
matesax
Tvůrce
Avatar
matesax:19.1.2013 7:58

Dobrý den,
zasekl jsem se na nějaké asi dost hloupé kravině - jak už to tak bývá... :)

List<string> openTags = new List<string>();

List<List<string>> closedTags = new List<List<string>>();

foreach (Match m in Regex.Matches(html, "<[^<>]+>"))
{
        if (!Regex.IsMatch(m.Value, @"^\s*<\s*!--.*-->$"))
        {
                if (Regex.IsMatch(m.Value, @"\s*/\s*>$"))
                        closedTags[closedTags.Count - 1].Add(m.Value);
                else
                {
                        if (Regex.IsMatch(m.Value, @"^\s*<\s*/"))
                        {
                                string tagName = Regex.Match(m.Value, "[a-zA-Z1-6]+").Value;

                                List<string> tagElements = new List<string>();

                                for (int index = openTags.Count - 1; index > -1; index--)
                                        if (Regex.IsMatch(openTags[index], @"^\s*<\s*" + tagName))
                                        {
                                                for (int index2 = index; index2 < closedTags.Count; index2++)
                                                        tagElements.AddRange(closedTags[index2]);

                                                openTags.RemoveRange(index, openTags.Count - index);

                                                closedTags.RemoveRange(index, closedTags.Count - index);

                                                closedTags[closedTags.Count - 1].AddRange(tagElements);

                                                break;
                                        }
                        }
                        else
                        {
                                openTags.Add(m.Value);
                                closedTags.Add(new List<string>());
                        }
                }
        }
}

Dokud jsem chtěl jen výpis seznamu tagů z HTML kódu, bylo to OK, nyní se snažím o zachycení vnoření - postupuji takto:

Každý jednopárový tag - uzavřený lomítkem - je automaticky přidán na vrch zásobníku.

if (Regex.IsMatch(m.Value, @"\s*/\s*>$"))
        closedTags[closedTags.Count - 1].Add(m.Value);

Každý uzavírací tag - začínající / - spustí hledání k němu pasujícího otevírajícího tagu. A tady máte důvod, proč nepoužívám Stack a kód je tak složitý - nepočítám s tím, že každému otevírajícímu tagu náleží uzavírající - jelikož od té doby, co mám zapnutou chybovou konzoli se divím, že internet ještě existuje... :)

Každému otevřenému tagu přidávám uzavřené (každý otevřený má seznam svých uzavřených), když pak zjistím, že shoda pro uzavírající tag je až 3 indexy od konce, tak vycucnu uzavřené tagy i těmto neuzavřeným - a tím je navždy pohřbím. Plánuji tyto neuzavřené tagy dávat do seznamu - a vypsat je...

Logika se zdá být OK - no ne? :) Ale párové uzavřené tagy mi to prostě nevydá - jen jednopárové uzavřené - zbytek se zdá být prázdný. Děkuji za pomoc.

 
Odpovědět
19.1.2013 7:58
Avatar
matesax
Tvůrce
Avatar
matesax:19.1.2013 8:04

Už tady to je prázdné:

for (int index2 = index; index2 < closedTags.Count; index2++)
    tagElements.AddRange(closedTags[index2]); //výpis "closedTags[index2]" udělá prázdný řádek...
 
Nahoru Odpovědět
19.1.2013 8:04
Avatar
matesax
Tvůrce
Avatar
matesax:19.1.2013 11:07

Samozřejmě - hovadina - nepřidal jsem počáteční a koncový tag... :)

 
Nahoru Odpovědět
19.1.2013 11:07
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.