首页 > 解决方案 > 如何获取标签值并替换存储在表中的html代码中的标签

问题描述

我有一段 html 代码存储在表中,我需要替换一些特定的标签。

<br><pws:img num="10956">Pic001</psw:img><br><br><table border="0" cellpadding="0" cellspacing="0" width="696" style="color: #000000; font-family: -webkit-standard; border-collapse: collapse; width: 522pt; border: 1px dashed #AAAAAA;" prevstyle="color: #000000; font-family: -webkit-standard; border-collapse: collapse; width: 522pt; border: 1px dashed #AAAAAA;"><tr><td><pws:img num="10201">Pic002</psw:img></td></tr></table>

pws:img我需要替换所有出现的标签,<img src="files/NUM" alt="TEXT"> 其中 NUM 是pws:img标签中的 num 属性值(第一次出现 10956,第二次出现 10201),TEXT 是字符串(第一次出现 Pic001)

所以第一次<pws:img num="10956">Pic001</psw:img>出现应该被替换为<img src="files/10956" alt="Pic001">

我使用 for cycle 和 regexp_replace/regexp_substr 制作了函数,但无法正常工作。谢谢帮助

标签: sqloracle

解决方案


一般来说,不要使用正则表达式来解析 XML/HTML;pws:img但是,如果您可以保证标签中没有嵌套元素,那么您可以使用以下内容:

CREATE TABLE test_data ( html ) AS
SELECT '<br><pws:img num="10956">Pic001</pws:img><br><br><table><tr><td><pws:img num="10201">Pic002</pws:img></td></tr></table>'
FROM   DUAL
SELECT REGEXP_REPLACE( html, '<pws:img\s+([^>"]|".*?")*num\s*=\s*("(\d+)"|(\d+))([^>"]|".*?")*>.*?</pws:img>', '<img src="files/\3\4" alt="TEXT" />') AS replaced_html
FROM   test_data

哪个输出:

| 替换_HTML |
| :------------------------------------------------ -------------------------------------------------- ------------------ |
| <br><img src="files/10956" alt="TEXT" /><br><br><table><tr><td><img src="files/10201" alt="TEXT" /> </td></tr></table> |

您也可以使用 FLOWR 表达式来执行此操作(如果您可以让您的 HTML 片段成为有效的 XHTML 文档):

SELECT XMLQUERY(
         'copy $NEWHTML := .
         modify (
           for $i in $NEWHTML/body//pws_img
           return replace node $i with <img num="{$i/@num}" alt="TEXT" />
         )
         return $NEWHTML/body/*'
         PASSING XMLTYPE(
           '<body>'
           || REPLACE( REPLACE( html, '<br>', '<br />' ), 'pws:img', 'pws_img' )
           || '</body>'
         )
         RETURNING CONTENT
       ).getStringVal() AS replacement_html
FROM   test_data

输出:

| 替换_HTML |
| :------------------------------------------------ -------------------------------------------------- ------ |
| <br/><img num="10956" alt="TEXT"/><br/><br/><table><tr><td><img num="10201" alt="TEXT"/>< /td></tr></table> |

db<>在这里摆弄


推荐阅读