Удалить не-HTML специальные теги из текста - PullRequest
0 голосов
/ 08 августа 2010

У меня проблема с сопоставлением не-HTML тегов в тексте в основном, потому что теги начинаются с &lt; и заканчиваются &gt;, но не < и >. Поэтому вместо <ref>xx</ref> у меня есть &lt;ref&gt;xxx&lt;/ref&gt;. Что мне нужно сделать, это удалить все такие теги, включая их содержимое.

Проблема в том, что некоторые теги могут иметь атрибуты. Я нашел хороший ответ здесь но все же есть проблема.

Предполагая, что у меня есть тег вроде: <gallery src=sss>xxx</gallery> это выражение подходит идеально:

@"<(?<Tag>\w+)[^>)]*>.*?</\k<Tag>>"

Реальность совсем другая, и все специальные символы экранированы, поэтому тег выглядит так: &lt;gallery src=sss&gt;xxx&lt;/gallery&gt;. Моя проблема состоит в том, чтобы соответствовать этому королю тегов. Пока у меня есть это выражение: @"\&lt\;(?<Tag>\w+)[^\&)]*\&gt\;.*?\&lt\;/\k<Tag>\&gt\;". Он совпадает с тегами без атрибутов, но не с упомянутыми выше. Чего мне не хватает?

Вторая проблема связана с тегами {| |}, поскольку они могут быть вложенными. Можете ли вы помочь мне с этим также? Это выражение не выполняет работу: @"\{\|(?:[^\|\}]|\{\|[^\|\}]*\|\})*\|\}"

Редактировать : Уточнить второй вопрос. Я должен сопоставить строки, которые начинаются с открывающего тега {|, затем идут текст и заканчиваются тегами |}. Эта структура может быть вложенной, поэтому: {| xxx {| yyy |} xxx |} разрешено. К сожалению, я не знаю максимального уровня вложенности, но допустим, что 1 подходит для большинства случаев.


Редактировать 2 : Это выражение работает для моего 1-го выпуска @"\&lt\;(?<Tag>\w+).*?\&lt\;/\k<Tag>\&gt\;". Я заметил, что произойдет сбой, если между открывающим и закрывающим тегами будет новая отметка.

Редактировать 3 : Это работа со вторым выпуском: @"\{\|(?>(?!\{\||\|\}).|\{\|(?<N>)|\|\}(?<-N>))*(?(N)(?!))\|\}"

Ответы [ 3 ]

0 голосов
/ 08 августа 2010

Это регулярное выражение должно (частично) работать:

@"&lt;.+?&gt;(.*?)&lt;/.+?&gt;"

При этом регулярное выражение не подходит для анализа (X) HTML.Вот лучшее решение:

  1. Добавьте идентификатор после &lt;, то есть: BOGUS000: YourStr.Replace("&lt;", "&lt;BOGUS000")
  2. Теперь преобразуйте &lt; и %gt; в <и > с использованием HttpServerUtility.HtmlDecode()
  3. Разбор файла с использованием анализатора XML
  4. Теперь вы знаете, что все элементы, имена которых начинаются с вашего идентификатора (здесь BOGUS000), ну,поддельный.Они могут быть удалены.
  5. Прибыль!:)

Я не уверен, что понимаю ваш второй вопрос.

0 голосов
/ 08 августа 2010

добавьте RegexOptions.Singleline к вызову Regex.Replace () (да, я знаю, он чувствует себя задом наперед), чтобы решить проблему с несоответствующим тегом, охватывающим несколько строк.

вторая проблема: как это не совсем точнота же проблема?Вам дано регулярное выражение - просто замените ограничивающие строки и готово.

0 голосов
/ 08 августа 2010

так у вас есть HTML-экранированный текст, в котором вы хотите найти элементы? Почему бы не сначала удалить его, а затем использовать уже имеющийся код? Для этого вы можете использовать HttpServerUtility.HtmlDecode().

редактировать: попробуйте тогда

string text = "PLAIN-TEXT&lt;gallery src=sss&gt;xxx&lt;/gallery&gt;PLAIN-TEXT";
while (text.IndexOf("&lt;") > -1)
    text = Regex.Replace(text, "&lt;\\w+.*?&lt;/\\w+&gt;", "");
Console.WriteLine(text);

на случай, если это сбивает с толку: цикл для вложенных тегов. Вы можете справиться с ними с помощью Regex, но это будет сложно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...