特定のデータベース列ですべての「&lt」を<
に置き換える最良の方法は何ですか?基本的にs/<[^;]/</gi
を実行します
ノート:
<;;;;;;;;;
で終わっていないこと)いくつかのハッキングが必要ですが、これは[〜#〜] like [〜#〜]、[〜#〜] patindex [〜#〜]、[〜#〜]左[〜#〜] AND [〜#〜]右[〜#〜]と古き良き文字列連結。
create table test
(
id int identity(1, 1) not null,
val varchar(25) not null
)
insert into test values ('< <- ok, < <- nok')
while 1 = 1
begin
update test
set val = left(val, patindex('%<[^;]%', val) - 1) +
'<' +
right(val, len(val) - patindex('%<[^;]%', val) - 2)
from test
where val like '%<[^;]%'
IF @@ROWCOUNT = 0 BREAK
end
select * from test
これはSQL Serverのバージョンに依存せず、問題なく動作するはずです。
別のSTUFFを使用すれば、これはもっときれいにできると思います:)
create table test
(
id int identity(1, 1) not null,
val varchar(25) not null
)
insert into test values ('< <- ok, < <- nok')
WHILE 1 = 1
BEGIN
UPDATE test SET
val = STUFF( val , PATINDEX('%<[^;]%', val) + 3 , 0 , ';' )
FROM test
WHERE val LIKE '%<[^;]%'
IF @@ROWCOUNT = 0 BREAK
END
select * from test
どうですか:
UPDATE tableName
SET columName = REPLACE(columName , '<', '<')
WHERE columnName LIKE '%lt%'
AND columnName NOT LIKE '%lt;%'
編集:
これが、部分的に正しい<
文字列を持つ列を無視することに気づきました。
その場合は、where句の2番目の部分を無視して、後で呼び出すことができます。
UPDATE tableName
SET columName = REPLACE(columName , '<;', '<')
この記事 は、SQL 2000(および2005で単純なTweakを使用)で使用できる単純な正規表現置換関数を作成する方法を説明しています。
このパターンに非常に固有ですが、私はこれと似たようなことを以前に行いました。
REPLACE(REPLACE(columName, '<', '<'), '<', '<')
より広い例(TITLE属性で不適切な可能性がある文字をエンコードする)
REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
columName
-- Remove existing encoding:
, '&', '&')
, '"', '"')
, ''', '''')
-- Reinstate/Encode:
, '&', '&')
-- Encode:
, '"', '"')
, '''', ''')
, ' ', '%20')
, '<', '%3C')
, '>', '%3E')
, '/', '%2F')
, '\', '%5C')
MSSQLの正規表現が否定的な先読みをサポートしている場合、これはこれに取り組む正しい方法です。
s/<(?!;)/</gi
&ltの後に;が続いていないすべてのインスタンスをキャッチします(それらの後に何もない場合でも[^;]はミス)と、次の非;文字を一致の一部としてキャプチャしないため、元の質問のコメントで言及されている、置換時に文字が失われるという問題が解消されます。
残念ながら、私はMSSQLを使用していないため、ネガティブルックアヘッドをサポートしているかどうかはわかりません...