Регулярное выражение - удаление комментария HTML, охватывающего несколько разрывов строк

Я использую этот скрипт:

http://www.codeproject.com/Articles/11902/Convert-HTML-to-Plain-Text

Чтобы преобразовать некоторый внешний вид HTML в обычный текст.

Это почти работает, единственное, что он оставляет, это CSS, который отображает места в HTML-тегах комментариев.<!-- --> в дополнение к<style> теги (которые удалены)

This is the original text:

<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
    {font-family:Calibri;
    panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
    {margin:0cm;
    margin-bottom:.0001pt;
    font-size:11.0pt;
    font-family:"Calibri","sans-serif";
    mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
    {mso-style-priority:99;
    color:blue;
    text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
    {mso-style-priority:99;
    color:purple;
    text-decoration:underline;}
span.EmailStyle17
    {mso-style-type:personal-compose;
    font-family:"Calibri","sans-serif";
    color:windowtext;}
.MsoChpDefault
    {mso-style-type:export-only;
    font-family:"Calibri","sans-serif";
    mso-fareast-language:EN-US;}
@page WordSection1
    {size:612.0pt 792.0pt;
    margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
    {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-GB" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">tesst<o:p></o:p></p>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:dimgray;mso-fareast-language:EN-GB">JOE BLOGS</span></b><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:dimgray;mso-fareast-language:EN-GB">
</div>
</body>
</html>

This is the resulting text: (обратите внимание, что HTML-комментарий не был удален)

<!--
/* Font Definitions */
@font-face
    {font-family:Calibri;
    panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
    {margin:0cm;
    margin-bottom:.0001pt;
    font-size:11.0pt;
    font-family:"Calibri","sans-serif";
    mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
    {mso-style-priority:99;
    color:blue;
    text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
    {mso-style-priority:99;
    color:purple;
    text-decoration:underline;}
span.EmailStyle17
    {mso-style-type:personal-compose;
    font-family:"Calibri","sans-serif";
    color:windowtext;}
.MsoChpDefault
    {mso-style-type:export-only;
    font-family:"Calibri","sans-serif";
    mso-fareast-language:EN-US;}
@page WordSection1
    {size:612.0pt 792.0pt;
    margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
    {page:WordSection1;}
-->

tesst
&nbsp;
JOE BLOGS

Я попытался адаптировать функцию StripHTML () с дополнительными заменами - но они также не работали.

result = System.Text.RegularExpressions.Regex.Replace(result, "(<!--).*?(-->)", String.Empty, System.Text.RegularExpressions.RegexOptions.IgnoreCase)
result = System.Text.RegularExpressions.Regex.Replace(result, "<!--*-->", String.Empty, System.Text.RegularExpressions.RegexOptions.IgnoreCase)

Пожалуйста, помогите - это была двухминутная работа, на которой я застрял с обедаfacedesk

ура

Edit 1: тоже попробовал следующее - до сих пор нет радости

result = System.Text.RegularExpressions.Regex.Replace(result, "<!--.*-->", String.Empty, System.Text.RegularExpressions.RegexOptions.IgnoreCase)
result = System.Text.RegularExpressions.Regex.Replace(result, "<!--.*?-->", String.Empty, System.Text.RegularExpressions.RegexOptions.IgnoreCase)

Edit 2: Я заметил, что этот вопрос получает много просмотров, и всем, кто его читает, непременно стоит дважды подумать о подходе regExp, вместо этого я рекомендую использовать Lynx (текстовый браузер на основе OpenSource) для преобразования HTML в простой текст, я задал похожий вопросВот и я предоставляю пример кода в изменениях на основе ответов, которые должны помочь вам начать использовать lynx.exe из приложения .net. Это метод, который мы в конечном итоге использовали, и с тех пор у нас не было никаких проблем.

 Mark Byers18 мая 2012 г., 18:36
@ HeavenCore: он все еще там, в примерах:htmlagilitypack.codeplex.com/SourceControl/changeset/view/…
 Mark Byers18 мая 2012 г., 18:15
Не очень хорошая идея использовать регулярные выражения для разбора HTML. Рассмотреть возможность использованияHtml Agility Pack вместо.
 HeavenCore18 мая 2012 г., 18:20
Я не смог найти метод converttoplaintext () в пакете HTML Agility Pack - они его удалили?
 Matthew18 мая 2012 г., 18:15
Потенциально актуально:stackoverflow.com/questions/1732348/…

Ответы на вопрос(2)

Решение Вопроса

Ваше второе регулярное выражение по трем причинам:

You need to use . to match any character. The * is greedy. You want *? to match lazily. You need RegexOptions.Singleline.

Попробуй это:

result = Regex.Replace(result, "<!--.*?-->", "", RegexOptions.Singleline);

Я настоятельно рекомендую вам не использовать регулярные выражения для разбора HTML. Вы спасете себя от боли, если будете использоватьHTML Agility Pack.

 HeavenCore19 мая 2012 г., 22:11
Привет Марк,<!--.*?--> + Singleline тоже не сработало, однако я принял совет и отказался от опции reg ex, сейчас я работаю над HTML Agilty Pack Solution и обновлю свой вопрос, если столкнусь с какими-либо проблемами / найду решение.
 HeavenCore18 мая 2012 г., 18:17
Извините, Марк, см. Редактирование 1 - ни один из них также не удаляет раздел комментариев
 HeavenCore20 мая 2012 г., 18:41
Привет Марк, спасибо за то, что указал мне на образец, который был идеальным (таблица делает его немного бедным, но отдельно от этого места).

Что касается использования HTML Agility Pack для этой цели, существует проект под названием Html2Txt загрузите исходный код в папку htmlagilitypack-xxxx \ Release \ 1_4_0 \ Html2Txt.

HtmlConvert.cs содержит все необходимые функции для преобразования HTML в текст, а также для работы с комментариями HTML и т. Д.

Ваш ответ на вопрос