Как получить значение тега и заменить теги в HTML-коде, хранящемся в таблице - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть фрагменты 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 - это NUMзначение атрибута num из тега pws:img (10956 в 1-м вхождении, 10201 в 2-м вхождении), а TEXT - это строка (Pic001 в 1-м вхождении)

Таким образом, 1-е вхождение <pws:img num="10956">Pic001</psw:img> следует заменить на <img src="files/10956" alt="Pic001">

Я сделал функцию с for и regexp_replace / regexp_substr, но не работает. Спасибо за помощь

1 Ответ

1 голос
/ 01 ноября 2019

Как правило, не используйте регулярные выражения для разбора 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> |

дБ <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...