我有一张表,其中一列的文字与HTML数据混合在一起。这是由于脚本中的错误(已修复),但需要编辑SQL数据以反映更改。该列的类型为nvarchar(max, null)
。我需要做的就是找到<a img="lkss">
,<div attr=val>
等标记,并用空字符串""
替换它们。我查看了this,但解决方案说明了如何根据一种模式替换整个内容。我的问题是我需要部分替换内容,但保留干净的文本(即不是HTML标签/属性)。任何建议/帮助表示赞赏。
测试列数据:
<div attr=val; color=somecolor>inside text<div some=val><a some=val>Inside anchor
预期结果:
inside textInside anchor
答案 0 :(得分:1)
我使用这样的CTE:
DECLARE @str nvarchar(max) = '<div attr=val; color=somecolor>inside text<div some=val><a some=val>Inside anchor';
WITH CTE(myStr) AS (
SELECT @str
UNION ALL
SELECT REPLACE(mystr, SUBSTRING(myStr, CHARINDEX('<', myStr, 1), CHARINDEX('>', myStr, 1) - CHARINDEX('<', myStr, 1) + 1), '')
FROM CTE
WHERE PATINDEX('%<%>%',myStr) > 0
)
SELECT myStr
FROM CTE
WHERE PATINDEX('%<%>%',myStr) = 0
我建议你在这样的SVF中使用它:
CREATE FUNCTION tagRemover
(
@str nvarchar(max)
)
RETURNS nvarchar(max)
AS
BEGIN
DECLARE @ResultVar nvarchar(max);
SELECT @ResultVar = @str;
;WITH CTE(myStr, id) AS (
SELECT @str, 1
UNION ALL
SELECT REPLACE(mystr, SUBSTRING(myStr, CHARINDEX('<', myStr, 1), CHARINDEX('>', myStr, 1) - CHARINDEX('<', myStr, 1) + 1), ''), id + 1
FROM CTE
WHERE PATINDEX('%<%>%',myStr) > 0
)
SELECT @ResultVar = myStr
FROM CTE
WHERE PATINDEX('%<%>%',myStr) = 0;
RETURN @ResultVar;
END
GO