регулярное выражение, чтобы избежать угловых скобок не HTML-теги - PullRequest
0 голосов
/ 22 марта 2010

У меня есть текст на основе HTML (с тегами HTML), я хочу найти слова, которые встречаются в угловых скобках, и заменить квадратные скобки на <и> или даже когда угловые скобки используются как математические символы

например:

String text= "Hello, <b> Whatever <br /> <table> <tr> <td width="300px"> 
              1 < 2 This is a <test> </td> </tr> </table>";

Я хочу, чтобы это было:

Hello,  <b> Whatever <br /> <table>  <tr> <td width="300px"> 
1 &lt; 2 This is a &lt; test &gt; </td> </tr> </table>

СПАСИБО заранее

Ответы [ 4 ]

3 голосов
/ 22 марта 2010

Я бы предложил вам использовать Html Cleaner

Если вы посмотрите на HomePage, пример показывает, как именно текст экранируется.

<td><a href=index.html>1 -> Home Page</a>

конвертируется в

<td>
   <a href="index.html">1 -&gt; Home Page</a>
</td>

нормализует ваш html, чтобы соответствовать стандарту xHtml. Я использовал его в прошлом, и (ИМХО) он довольно надежный и надежный, чем jTidy & Co. (и, конечно, лучше использовать регулярные выражения или заменить стратегии ...)

1 голос
/ 22 марта 2010

Пожалуйста, смотрите RegEx соответствует открытым тегам, кроме автономных тегов XHTML и не использует регулярные выражения для анализа HTML Используйте синтаксический анализатор SGML, но не используйте регулярные выражения. Было бы не часто. HTML не является обычным языком.

0 голосов
/ 01 ноября 2010

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

Вам нужна библиотека Regexp, которая поддерживает предположения нулевой ширины.,В моем случае это был Oniguruma в Ruby 1.8.

Чтобы соответствовать символам меньше, чем (<), я сделал: </p>

/<(?!(/?[A-Za-z_:0-9]+\s?/?>))/

Сравнивать символы больше (>) сложнее.Большинство библиотек не поддерживают утверждения обратной ширины нулевой ширины переменной длины.Итак, вы обманываете: переверните строку, выполните предварительное утверждение и затем верните его обратно, используя следующий шаблон:

>(?!(/?\s?[A-Za-z_:0-9]+/?<))

Итак, мой код выглядит примерно так:

match_less_than = Oniguruma::ORegexp.new('<(?!(/?[A-Za-z_:0-9]+\s?/?>))')
match_less_than.gsub!(string, '&lt;')

match_greater_than = Oniguruma::ORegexp.new('>(?!(/?\s?[A-Za-z_:0-9]+/?<))')
string = match_greater_than.gsub(string.reverse, '&gt;'.reverse).reverse

Противно, да?

0 голосов
/ 22 марта 2010

Если бы не секции CSS, Javascript и CData, это было бы возможно.

Если вы имеете дело только с подмножеством HTML, вы могли бы сделать предположение, чтоугловые скобки, не окруженные действительными символами идентификатора элемента, могут быть закодированы.

Что-то вроде "<(? = [^ A-Za-z_: 0-9 /])" -> "<" и "(?<= [^ A-Za-z_: 0-9 /])> "->"> "

Но, если вы сами не генерируете HTML и НЕ ЗНАЕТЕ, что в нем нет встроенных CSS, javascript, CDataили разделы объекта ...

Как сказал фраидо, не используйте регулярные выражения для нерегулярных языков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...