Регулярное выражение для выхода из амперсандов HTML при уважении CDATA

Попробуйте настроить sqlcommand и sqldatareader следующим образом:

    Dim command As New SqlCommand("SELECT * FROM rescuers WHERE LastName='" & searchres.Text & "'", connection)
    Dim reader As SqlDataReader = command.ExecuteReader()

Опубликуйте свой код для настройки SqlConnection.

8
задан Evan Fosmark 21 January 2009 в 03:29
поделиться

5 ответов

Вы попросили его!:D

/&(?!(?:[a-zA-Z][a-zA-Z0-9]*|#\d+);)
 (?!(?>(?:(?!<!\[CDATA\[|\]\]>).)*)\]\]>)/xm

Первая строка является Вашим исходным regex. Предвидение соответствует, если существует CDATA, закрывающий последовательность ( ]]> ) вперед, если нет вводная последовательность ( <!CDATA[ ) между тут и там. Принятие документа минимально хорошо формируется, который должен означать, что текущая позиция в разделе CDATA.

Ой, у меня было это назад: при помощи положительного предвидения я соответствовал "явным" амперсандам только в разделах CDATA. Я изменил его на отрицательное предвидение, поэтому теперь это работает правильно.

Между прочим, этот regex работает в RegexBuddy в режиме Ruby, но не на rubular сайте. Я подозреваемый Rubular использую более старую версию Ruby с менее - мощная поддержка regex; кто-либо может подтвердить это? (Как Вы, возможно, предположили, я не Ruby программист.)

Править: Проблема в Rubular состояла в том, что я использовал' в качестве модификатора (для значения dot-matches-everything), но Ruby использует 'm' для этого.

7
ответ дан 5 December 2019 в 15:27
поделиться

Не используйте регулярные выражения для этого. Это - ужасная, ужасная идея. Вместо этого просто HTML кодирует что-либо, что Вы производите, который мог бы иметь символ в нем. Как это:

require 'cgi'
print CGI.escape("All of this is HTML encoded!")
3
ответ дан 5 December 2019 в 15:27
поделиться

Это работало! В Rubular я должен был изменить опции от /xs кому: /m (и я удалил пробел, который разделяет две части regex, когда Вы показали его выше).

Вы видите это регулярное выражение в действии наряду с демонстрационной строкой по http://www.rubular.com/regexes/5855.

В случае, если, что постоянная ссылка Rubular не является действительно постоянной, вот то, что я ввел для регулярного выражения:

/&(?!(?:[a-zA-Z][a-zA-Z0-9]*|#\d+);)(?!(?>(?:(?!<!\[CDATA\[|\]\]>).)*)\]\]>)/m

И вот тестовая строка:

<p>a & b</p>
<p>c &amp; d</p>
<script type="text/javascript">
  // <![CDATA[
  if (a && b) doSomething('a & b &amp; c');
  // ]]>
</script>
<p>a & b</p>
<p>c &amp; d</p>

Только два соответствия амперсандов - a & b наверху и a & b внизу. Амперсанды уже вышли как &amp; и все амперсанды (вышел или не) между <![CDATA[ и ]]> оставлены в покое.

Так, мой заключительный код - теперь это:

html.gsub(/&(?!(?:[a-zA-Z][a-zA-Z0-9]*|#\d+);)(?!(?>(?:(?!<!\[CDATA\[|\]\]>).)*)\]\]>)/m, '&amp;')

Большое спасибо Alan. Это точно, в чем я нуждался.

1
ответ дан 5 December 2019 в 15:27
поделиться

Я сделал что-то подобное здесь:
Лучший способ закодировать текстовые данные для XML

К счастью, в моем случае CDATA не был проблемой.

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

.... <words> are < safe! >

0
ответ дан 5 December 2019 в 15:27
поделиться

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

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

0
ответ дан 5 December 2019 в 15:27
поделиться
Другие вопросы по тегам:

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