Как правило, не используйте регулярные выражения для разбора 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
Какие выходные данные:
| REPLACED_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
, который выдает:
| REPLACEMENT_HTML |
| :--------------------------------------------------------------------------------------------------------- |
| <br/><img num="10956" alt="TEXT"/><br/><br/><table><tr><td><img num="10201" alt="TEXT"/></td></tr></table> |
дБ <> скрипка здесь