Вопрос по regex, vb.net, c#, replace – Регулярное выражение - удаление комментария HTML, охватывающего несколько разрывов строк

4

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

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. Это метод, который мы в конечном итоге использовали, и с тех пор у нас не было никаких проблем.

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

Ваш Ответ

2   ответа
7

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

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

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

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

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

Похожие вопросы