Преобразование> в эквивалент объекта HTML в строке HTML

Я пытаюсь преобразовать все экземпляры символa > в его эквивалент сущности HTML, > , внутри строки HTML, которая содержит теги HTML. Дальше я смог получить решение для этого, используя регулярное выражение.

Вот что я до сих пор:

public static readonly Regex HtmlAngleBracketNotPartOfTag = new Regex("(?:<[^>]*(?:>|$))(>)", RegexOptions.Compiled | RegexOptions.Singleline);

Основная проблема, с которой я столкнулась, заключается в изоляции одиночных > символов, которые не являются частью тега HTML. Я не хочу конвертировать существующие теги, потому что мне нужно сохранить HTML для рендеринга. Если я не конвертирую символы > , я получаю неверный HTML-код, что вызывает проблемы с обработкой в ​​браузере.

Это пример тестовой строки для синтаксического анализа:

"Ok, now I've got the correct setting.On 12/22/2008 3:45 PM, [removed_email] wrote:<div class"quotedreply"="">> Ok, got it, hope the angle bracket quotes are there.>> On 12/22/2008 3:45 PM, > [removed_email] wrote:>> Please someone, reply to this.>>></div>"

В приведенной выше строке ни один из символов > , которые являются частью тегов HTML, не следует преобразовывать в > . Итак, это:

<div class"quotedreply"=""><code>>
</code>
<p>должно стать следующим:</p>
<pre class="prettyprint linenums"><div class"quotedreply"=""><code>>
</code>
<p>Другая проблема заключается в том, что в приведенном выше выражении используется группа, не захватывающая запись, что прекрасно, за исключением того факта, что совпадение относится к группе 1. Я не совсем уверен, как сделать замену только в группе 1 и сохранить остальной части матча. Похоже, что MatchEvaluator на самом деле не делает этого трюка, или, может быть, я просто не могу представить его прямо сейчас.</p>
<p>Я подозреваю, что мое регулярное выражение может сделать с некоторой любовью.</p>
<p>У кого-нибудь есть яркие идеи?</p></div>
6 ответов

Трюк состоит в том, чтобы захватить все, что не является целью, затем подключить его вместе с измененным текстом, например:

Regex.Replace(str, @"\G((?>[^<>]+|<[^>]*>)*)>", "$1>");

Но право Энтони: прямоугольные скобки в текстовых узлах не должны вызывать никаких проблем. И соответствие HTML с регулярными выражениями сложно; например, комментарии и CDATA могут содержать практически все, поэтому надежное регулярное выражение должно соответствовать им конкретно.


Почему вы хотите это сделать? Какого вреда делать? Большинство парсеров, с которыми я столкнулся, вполне довольны a > самостоятельно, не требуя, чтобы его удалось скрыть до сущности.

Кроме того, было бы более целесообразно правильно кодировать строки содержимого с помощью HtmlUtilty.HtmlEncode, прежде чем конкатенировать их со строками, содержащими разметку HTML, поэтому, если это находится под вашим контролем, вам следует рассмотреть вопрос об этом.


Возможно, прочитайте свой HTML в XML-парсер, который должен позаботиться о конверсиях для вас.


Не могли бы вы прочитать строку в документе XML и посмотреть значения и заменить значения > на > в значениях. Это потребует рекурсивного перехода в каждый node в документе, но это не должно быть слишком сложно сделать.


Steve_C, вы можете попробовать этот RegEx. Это приведет к захвату любых HTML-тегов в ссылке 1, а текст между тегами будет сохранен во время захвата 2. Я не полностью протестировал это, просто выбросив его там, если это может помочь.

<([A-Z][A-Z0-9]*)[^>]*>(.*?)<!--\1-->


Вы говорите о > символах внутри тега HTML (как в Java innerText) или в списке аргументов HTML-тега?

Если вы хотите просто дезинфицировать текст между тегом открытия и закрытия, это должно быть довольно простым. Просто найдите any > char и замените его символом & gt;. (Я бы тоже сделал это с тегом & lt), но движок HTML-рендеринга СЛЕДУЕТ позаботиться об этом для вас...

Приведите пример того, что вы пытаетесь дезинфицировать, и, возможно, мы найдем для него лучшее решение.

Larry

licensed under cc by-sa 3.0 with attribution.