除了img src和href之外,我如何删除字符串中的html标签。我尝试了如下,但它删除了所有标记。
SELECT
REGEXP_REPLACE('lorem <em>ipsum</em><img src="/folder/file.jpg" /> ipsum','<.*?>')
FROM DUAL;
结果:lorem ipsum(我需要像这样的lorem /folder/file.jpg ipsum)
答案 0 :(得分:1)
您需要保护<img
代码src
和<a
代码href
属性的内容不被删除。以下正则表达式仅保留原始数据中html标记的这些部分:
REGEXP_REPLACE (
REGEXP_REPLACE (
REGEXP_REPLACE (
'lorem <a class="interference" href="http://www.example.com"><em>ipsum</em><img src="/folder/file.jpg" /> ipsum</a> whatever'
, '<a[^>]*? href="([^"]+)"[^>]*>|<img[^>]*? src="([^"]+)"[^>]*>|<a[^>]*? href=''([^'']+)''[^>]*>|<img[^>]*? src=''([^'']+)''[^>]*>'
, '<<\1\2>>'
)
, '([^<])<[^<][^>]*>'
, '\1'
)
, '<<([^>]+)>>'
, ' \1 '
)
<强> 解释 强>
<<
,>>
。
匹配允许标记名称和目标属性之间的干扰属性以及由双引号或单引号分隔的属性值。'<<\1\2>>'
而不需要任何进一步的消歧逻辑。<<
,>>
。<强> 注意事项 强>
一般情况下,强烈建议不要使用regexen代替正确的解析。它更容易出错,更不灵活和可扩展;维护和调试的噩梦。
匹配不允许目标属性值中的转义双引号。
这不应该是src
和href
的问题;但是,期望遇到诸如title
或data-...
替换不应干扰文字中的数据,因为<
和>
需要在html中表示为实体,除非用作语法元素。但是,对于带有cdata部分的xhtml数据,这不会有效,其中会出现<<
,>>
。如果这可能是一个问题,请测试原始字符串的出现次数。
<强>补编强>
如果您希望在有效标记中保留所述属性值,请使用目标属性保护标记。为此,请使用以下内容:
REGEXP_REPLACE (
REGEXP_REPLACE (
REGEXP_REPLACE (
'lorem <a href="http://www.example.com"><em>ipsum</em><img src="/folder/file.jpg" /> ipsum</a> whatever'
, '(<a href|<img src|</a|</img)'
, '<\1'
)
, '([^<])<[^<][^>]*>'
, '\1'
)
, '<(<a href|<img src|</a|</img)'
, '\1'
)
<强> 解释 强>
<
为前缀。<<
开头的代码都会被替换<<
序列的后替代。
替换应用于与前缀<强> 注意事项 强>
一般警告仍然存在:最好不要使用regexen作为解析器的替身。
为了使结果保持有效html,需要保留匹配的开始和结束标记。不幸的是,这种匹配不能用oracle regexp faclities来解释(并且对于支持递归的其他正则表达式引擎来说非常复杂)。因此,所有结束a
和img
代码都会保留。
虽然后者很少在野外发生(除非它是xhtml),但前者会导致<a name="...
标签出现问题。
class
或data-
属性。由于4个支持的变体(标记名a
/ img
,单引号/双引号分隔符)和潜在的干扰属性,因此适应此案例会使正则表达式再次变得更复杂:-
REGEXP_REPLACE (
REGEXP_REPLACE (
REGEXP_REPLACE (
REGEXP_REPLACE(
'lorem <a href="http://www.example.com"><em>ipsum</em><img src="/folder/file.jpg" /> ipsum</a> whatever'
, '</(a|img)>'
, '<</\1>'
)
, '<(a )[^>]*?(href="[^"]+"|href=''[^'']+'')[^>]*>|<(img )[^>]*?(src="[^"]+"|src=''[^'']+'')[^>]*>'
, '<<\1\2\3\4>'
)
, '([^<])<[^<][^>]*>'
, '\1'
)
, '<(<a href|<img src|</a|</img)'
, '\1'
)