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.
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.