Как сделать замену тега regex HTML в SQL Server? - PullRequest
0 голосов
/ 12 апреля 2010

У меня есть таблица в SQL Server 2005 с сотнями строк с содержимым HTML. Некоторый контент имеет HTML, например:

<span class=heading-2>Directions</span>

где «Направления» меняются в зависимости от имени страницы.

Мне нужно изменить все теги <span class=heading-2> и </span> на <h2> и </h2>.

Я написал этот запрос для внесения изменений в содержание в прошлом, но он не работает для моей текущей проблемы из-за конечного тега HTML:

Update  ContentManager
Set ContentManager.Content = replace(Cast(ContentManager.Content AS NVARCHAR(Max)), 'old text', 'new text')

Кто-нибудь знает, как я могу выполнить переход на h2, заменив чисто в T-SQL? Все, что я нашел, показало, что я должен был сделать интеграцию CLR. Спасибо!

Ответы [ 4 ]

1 голос
/ 12 апреля 2010

Если вы положительный , что все HTML-кода (и будут оставаться) допустимым XHTML и вы используете SQL Server 2005 или более позднюю версию, возможно, вы сможете приведите столбцы к типу данных XML и используйте XQuery. Смотри http://msdn.microsoft.com/en-us/library/ms345117%28SQL.90%29.aspx

(Предостережение: я не пробовал это.)

Я думаю, что лучший ответ - комментарий Майкла Петито. Я написал бы приложение для этого и использовал бы Html Agility Pack . Это обеспечит постоянное, поддерживаемое решение, которое будет работать практически во всех случаях.

(Если это однократный выстрел, и вам не нужна точность, выберите яд).

1 голос
/ 12 апреля 2010

Действительно, T-SQL изначально не поддерживает регулярные выражения, и это та проблема, в которой регулярные выражения были бы предпочтительным инструментом. Во-первых, я скажу, что уровень сложности решения сильно зависит от того, насколько последовательны ваши данные. Например, предположим, что мы ищем элементы с заголовком:

Select ..
From ...
Where HtmlContent Like '<span class="heading-2">%'

Это предполагает отсутствие дополнительного интервала между span и class, а также отсутствие дополнительного интервала после заключительной двойной кавычки перед конечной скобкой. Мы могли бы написать '%<span%class="heading-2"%>%' для учета пробелов, но это также позволило бы найти теги div, помеченные как heading-2, в том же контенте, что и любой тег span. Если этот более поздний сценарий не должен произойти, но у вас могут быть различные пробелы, используйте этот пересмотренный шаблон. Где мы действительно столкнемся с неприятностями - это закрывающий тег. Предположим, что наш контент выглядит так:

<span class="heading-2"> Foo <span class="heading-3">Bar</span> And Gamma Too</span> .... <span class="heading-4">Fubar Is the right way!</span>...

Не так просто найти правильный закрывающий тег span для изменения на </h2>. Вы не можете просто найти первый </span> и изменить его на </h2>. Если бы вы знали, что у вас нет вложенных тегов span, вы можете написать пользовательскую функцию, которая сделает это:

Create Function ReplaceSpanToH2( @HtmlContent nvarchar(max) )
Returns nvarchar(max)
As
Begin
    Declare @StartPos int
    Declare @EndBracket int

    Set @StartPos = CharIndex('<span class="heading-2">', @HtmlContent)
    If @StartPos = 0
        Return @HtmlContent

    Set @HtmlContent = Replace(@HtmlContent, '<span class="heading-2">', '<h2>')

    -- find next </span>
    Set @StartPos = CharIndex('</span>', @HtmlContent, @StartPos)

    Set @HtmlContent = Stuff(@HtmlContent, @StartPos, 7, '</h2>')
    Return @HtmlContent
End
0 голосов
/ 12 апреля 2010

Я не очень силен в SQL Server, но вот как я бы попытался это сделать:

UPDATE TableName SET FieldName = REPLACE(FieldName ,'<span class=heading-2>', '<h2>') SET FieldName = REPLACE(FieldName, '</span>', '</h2>')

Может потребоваться, чтобы было выдано 2 оператора UPDATE, я не уверен, что вы можете работать с одним и тем же полем таким образом. ОП сказал ВСЕ вхождения текста. Поставь меня прямо, если я что-то упустил.

Конечно, если есть другой текст <span class=heading-2> или </span>, который вы не хотите изменять, это не сработает.

0 голосов
/ 12 апреля 2010

Гах, используйте jquery! Не усложняйте жизнь ... На домашней странице jquery есть пример кода замены, и вы можете просто включить jquery-1.4.2.js в раздел <head>

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