Вопрос

У меня есть HTML-контент, который вводится пользователем с помощью редактора richtext, поэтому он может быть практически любым (за исключением тех, которые не должны находиться за пределами тега body, не беспокойтесь о "head" или doctype и т.д.).Пример этого контента:

<h1>Header 1</h1>
<p>Some text here</p><p>Some more text here</p>
<div align=right><a href="x">A link here</a></div><hr />
<h1>Header 2</h1>
<p>Some text here</p><p>Some more text here</p>
<div align=right><a href="x">A link here</a></div><hr />

Хитрость в том, что мне нужно извлечь только первые 100 символов текста (HTML-теги удалены).Мне также нужно сохранить разрывы строк и не нарушать ни одного слова.

Таким образом, результат для приведенного выше будет примерно таким:

Header 1
Some text here

Some more text here

A link here

Header 2
Some text here

Some

Он состоит из 98 символов, и разрывы строк сохранены.Чего я могу добиться до сих пор, так это удалить все HTML-теги с помощью Regex:

Regex.Replace(htmlStr, "<[^>]*>", "")

Затем обрежьте длину, используя регулярное выражение, а также с помощью:

Regex.Match(textStr, @"^.{1,100}\b").Value

Моя проблема в том, как сохранить разрыв строки?.Я получаю вывод, подобный:

Header 1
Some text hereSome more text here
A link here
Header 2
Some text hereSome more text

Обратите внимание на соединяющиеся предложения?Возможно, кто-нибудь сможет показать мне какие-то другие способы решения этой проблемы.Спасибо!

Дополнительная информация:Моя цель - сгенерировать простой текстовый синопсис из множества HTML-контента.Думаю, это поможет прояснить данную проблему.

Это было полезно?

Решение 4

Что ж, мне нужно закрыть это, хотя у меня и нет идеального решения.Поскольку HTML-теги, используемые в моем приложении, очень распространенные (без таблиц, списков и т.д.) С небольшой вложенностью или вообще без нее, я предварительно отформатировал HTML-фрагменты, прежде чем сохранять их после пользовательского ввода.

  • Удалите все разрывы строк
  • Добавьте префикс переноса строки ко всем тегам блока (напримерdiv, p, hr, h1/2/3/4 и т.д.)

Прежде чем я извлеку их для отображения в виде обычного текста, используйте regex, чтобы удалить html-тег и сохранить разрыв строки.Вряд ли какая-то ракетостроительная наука, но у меня это работает.

Другие советы

Я думаю, что способ, которым я мог бы решить эту проблему, - это посмотреть на нее так, как если бы это был простой браузер.Создайте базовый класс тегов, сделайте его абстрактным, возможно, с помощью свойства innerHTML и виртуального метода PrintElement.

Затем создайте классы для каждого интересующего вас HTML-тега и унаследуйте их от вашего базового класса.Судя по вашему примеру, теги, которые вас больше всего волнуют, - это h1, p, a и hr.Реализуйте метод PrintElement таким образом, чтобы он возвращал строку, которая правильно выводит элемент на основе innerHTML (например, PrintElement класса p вернул бы " [innerHTML] ").

Затем создайте анализатор, который проанализирует ваш HTML-код и определит, какой объект создать, а затем добавит эти объекты в очередь (дерево было бы лучше, но не похоже, что это необходимо для ваших целей).

Наконец, пройдите по своей очереди, вызывая метод PrintElement для каждого элемента.

Может потребоваться больше работы, чем вы планировали, но это гораздо более надежное решение, чем простое использование регулярных выражений, и если вы решите изменить свое мнение в будущем и захотите продемонстрировать простой стиль, это всего лишь вопрос возврата и модификации ваших методов PrintElement.

Для информации, удаление html с помощью регулярного выражения является...полный тонких проблем.В HTML-Пакет Гибкости может быть более устойчивым, но все еще страдает от того, что слова сливаются воедино:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
string text = doc.DocumentNode.InnerText;

Одним из способов может быть удаление html в три этапа:

Regex.Replace(htmlStr, "<[^/>]*>", "") // don't strip </.*>
Regex.Replace(htmlStr, "</p>", "\r\n") // all paragraph ends are replaced w/ new line
Regex.Replace(htmlStr, "<[^>]*>", "") // replace remaining </.*>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top