将所有 '&lt' 替换为的最佳方法是什么 < 在给定的数据库列中?基本上执行 s/&lt[^;]/</gi

笔记:

  • 必须工作于 微软SQL服务器 2000
  • 必须是可重复的(并且不会以 <;;;;;;;;;)
有帮助吗?

解决方案

需要一些黑客攻击,但我们可以这样做 喜欢, 专利索引, 左边正确的 以及良好的旧字符串连接。

create table test
(
    id int identity(1, 1) not null,
    val varchar(25) not null
)

insert into test values ('&lt; <- ok, &lt <- nok')

while 1 = 1
begin
    update test
        set val = left(val, patindex('%&lt[^;]%', val) - 1) +
                      '&lt;' +
                      right(val, len(val) - patindex('%&lt[^;]%', val) - 2)
    from test
    where val like '%&lt[^;]%'

    IF @@ROWCOUNT = 0 BREAK
end

select * from test

更好的是,这与 SQL Server 版本无关,并且应该可以正常工作。

其他提示

我认为如果你使用不同的东西,这可以做得更干净:)

create table test
(
    id int identity(1, 1) not null,
    val varchar(25) not null
)

insert into test values ('&lt; <- ok, &lt <- nok')

WHILE 1 = 1
BEGIN
    UPDATE test SET
        val = STUFF( val , PATINDEX('%&lt[^;]%', val) + 3 , 0 , ';' )
    FROM test
    WHERE val LIKE '%&lt[^;]%'

    IF @@ROWCOUNT = 0 BREAK
END

select * from test

怎么样:

    UPDATE tableName
    SET columName = REPLACE(columName , '&lt', '&lt;')
    WHERE columnName LIKE '%lt%'
    AND columnName NOT LIKE '%lt;%'

编辑:

我刚刚意识到这会忽略部分正确的列 &lt; 字符串。

在这种情况下,您可以忽略 where 子句的第二部分,然后调用它:

    UPDATE tableName
    SET columName = REPLACE(columName , '&lt;;', '&lt;')

本文 介绍了如何创建一个简单的正则表达式替换函数,您可以在 SQL 2000(以及经过简单调整的 2005)中使用该函数来为您提供帮助。

如果 MSSQL 的正则表达式风格支持负向前瞻,那么这将是解决此问题的正确方法。

s/&lt(?!;)/&lt;/gi

将捕获所有实例 << 后面没有跟随 ; (即使他们后面什么都没有, [^;] 会错过)并且不捕获以下非; 角色作为比赛的一部分,消除了关于该角色在替换中丢失的原始问题的评论中提到的问题。

不幸的是,我不使用MSSQL,所以我不知道它是否支持负向前看......

对于这种模式非常具体,但我过去也做过类似的事情:

REPLACE(REPLACE(columName, '&lt;', '&lt'), '&lt', '&lt;')

更广泛的示例(对 TITLE 属性中可能不合适的字符进行编码)

REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
    columName
    -- Remove existing encoding:
    , '&amp;', '&')
    , '&#34;', '"')
    , '&#39;', '''')
    -- Reinstate/Encode:
    , '&', '&amp;')
    -- Encode:
    , '"', '&#34;')
    , '''', '&#39;')
    , ' ', '%20')
    , '<', '%3C')
    , '>', '%3E')
    , '/', '%2F')
    , '\', '%5C')
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top