Преобразовать> в HTML-эквивалент объекта в строке HTML - PullRequest
4 голосов
/ 24 декабря 2008

Я пытаюсь преобразовать все вхождения символа> в его эквивалент сущности 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.<br/><br/>On 12/22/2008 3:45 PM, jproot@somedomain.com wrote:<br/><div class"quotedReply">> Ok, got it, hope the angle bracket quotes are there.<br/>><br/>> On 12/22/2008 3:45 PM, > sbartfast@somedomain.com wrote:<br/>>> Please someone, reply to this.<br/>>><br/>><br/></div>"

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

<div class"quotedReply">>

должно стать таким:

<div class"quotedReply">&gt;

Другая проблема заключается в том, что в приведенном выше выражении используется группа без захвата, что вполне допустимо, за исключением того факта, что совпадение относится к группе 1. Я не совсем уверен, как выполнить замену только в группе 1 и сохранить Остальная часть матча. Похоже, что MatchEvaluator на самом деле не работает, или, может быть, я просто не могу представить это прямо сейчас.

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

У кого-нибудь есть яркие идеи?

Ответы [ 6 ]

4 голосов
/ 24 декабря 2008

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

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

3 голосов
/ 24 декабря 2008

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

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

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

1 голос
/ 24 декабря 2008

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

0 голосов
/ 24 декабря 2008

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

<([A-Z][A-Z0-9]*)[^>]*>(.*?)</\1>
0 голосов
/ 24 декабря 2008

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

0 голосов
/ 24 декабря 2008

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

Если вы хотите просто санировать текст между открывающим и закрывающим тегом, это должно быть довольно просто. Просто найдите любой символ> и замените его на & gt;. (Я бы также сделал это с тегом & lt), но движок рендеринга HTML ДОЛЖЕН позаботиться об этом за вас ...

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

Larry

...