Корректное сопоставление конечного тега с его начальным тегом в HTML с помощью RegEx - PullRequest
0 голосов
/ 29 мая 2009

Я использую VB.Net в приложении ASP.Net 2.0 для запуска некоторых регулярных выражений, которые удаляют ненужную разметку. Одна из вещей, которую я хотел бы сделать, это удалить элементы span, в которых нет атрибутов:

output = Regex.Replace(output, "<span\s*>(?<Text>.*?)</span>" & styleRegex, "${Text}", RegexOptions.Compiled Or RegexOptions.CultureInvariant Or RegexOptions.IgnoreCase Or RegexOptions.Singleline)

Итак, для этого контента:

<span>Lorem <span class="special">ipsum</span> dolor sit amet.</span>

Я хотел бы удалить элементы внешнего пролета. К сожалению, мое регулярное выражение выше дает мне это в результате, так как закрывающий интервал соответствует первому, с которым он сталкивается:

Lorem <span class="special">ipsum dolor sit amet.</span>

Возможно ли это с помощью RegEx или мне придется реализовать что-то более продвинутое?

Ответы [ 4 ]

2 голосов
/ 30 мая 2009

К сожалению, регулярные выражения не имеют такой силы. Вам понадобится хотя бы контекстно-зависимый язык, чтобы выразить что-то подобное. (простите за теоретический материал )

Я бы также предложил вместо этого использовать XSLT.

0 голосов
/ 19 сентября 2009

XSLT - не вариант, так как ввод не всегда может быть действительным XML, и Agility Pack в Codeplex выглядит довольно мило, но в этом случае это действительно излишне. Вот последний RegEx, который я использовал в итоге:

<span\s*>(?<Text>.*?(?:<span[^>]*>.*?</span>.*?)*)</span>

Заменив это на ${Text}, эффективно удалили ненужные внешние теги span во всех случаях, которые я тестировал.

0 голосов
/ 30 мая 2009

HTML-пакет Agility должен помочь в этом.

HTML-пакет Agility Pack для Codeplex

0 голосов
/ 30 мая 2009

Я бы использовал XSLT, а не регулярное выражение.

Кажется, .NET имеет хорошую поддержку XSLT (google: xslt vb.net), но я не знаю, будет ли он анализировать не-XHTML. Стандартная команда xsltproc будет с флагом --html.

...