Отказ от ответственности: обратите внимание, что я не защищаю попытки разбора произвольного HTML с помощью регулярных выражений или простых совпадений подстрок. Приведенное ниже решение предназначено для этой конкретной проблемы , которая, как представляется, намеренно ограничена, чтобы сделать возможным анализ с помощью простых методов. В общем, я согласен с консенсусом: для разбора HTML используйте HTML-парсер.
Это сказал. , .
Учитывая, что вложенные теги <p>
не разрешены, и при условии, что HTML-комментарии не разрешены, в цикле должно быть относительно легко выполнить следующее, чтобы найти и удалить все теги <p>
, которые имеют нет соответствующих </p>
.
string inputText = GetHtmlText();
int scanPos = 0;
int startTag = inputText.IndexOf("<p>", scanPos);
while (startTag != -1)
{
scanPos += 4;
// Now look for a closing tag or another open tag
int closeTag = inputText.IndexOf("</p">, scanPos);
int nextStartTag = inputText.IndexOf("<p>", scanPos);
if (closeTag == -1 || nextStartTag < closeTag)
{
// Error at position startTag. No closing tag.
}
else
{
// You have a full paragraph between startTag and (closeTag+5).
}
startTag = nextStartTag;
}
Код предполагает, что строки <p>
и </p>
не могут существовать в тексте, за исключением фактических открытых и закрывающих тегов абзаца. Если вы можете сделать эту гарантию, то вышеприведенное (или что-то очень похожее) должно работать довольно хорошо.
ДОБАВЛЕНО:
Работа с такими вещами, как <p class="classname">
и т. Д., Становится немного менее уверенной. Если вы можете гарантировать, что между открывающим <p
и закрывающим >
не будет никаких символов >
, вы можете изменить приведенный выше код для поиска <p
, а также <p>
, и если найдено, найдите закрывающий >
. Это немного грязно, но не особенно сложно.
При всем том, что я сказал, я бы не рекомендовал этот подход для анализа произвольного HTML из-за оговорок, о которых я уже говорил: он не будет обрабатывать комментарии и делает, вероятно, неверные предположения о формате HTML в целом. , Он также не будет обрабатывать такие вещи, как <p >
и </p >
, оба из которых являются совершенно действительными (и с которыми я столкнулся в дикой природе).