如何使用 PL/SQL 正则表达式将 HTML 标记及其内容替换为相同数量的“?s”?
Posted
技术标签:
【中文标题】如何使用 PL/SQL 正则表达式将 HTML 标记及其内容替换为相同数量的“?s”?【英文标题】:How can I use a PL/SQLregular expression to replace an HTML tag and its contents with a like number of '?s'? 【发布时间】:2013-08-26 12:48:21 【问题描述】:在 Pl/SQL 中我需要替换类似的东西;
'MOUSE RAT <FONT COLOR="#FF0000">DOG</FONT> CAT ELEPHANT'
与
'MOUSE RAT ????????????????????????????????? CAT ELEPHANT'
基本上,我需要用占位符“?”替换 html 标记及其之间的所有内容等于我要替换的字符串的长度。好消息是标签永远是字体标签。
REGEXP_REPLACE 会这样做吗?
如果那么图案是什么样的?
【问题讨论】:
您知道 PL/SQL 是专门在存储过程中使用的吗?存储过程/触发器/函数之外的任何内容都是“SQL”。 我并没有特别意识到这一点,但由于这是被放入包内的函数中,所以我猜我正在使用 PL/SQL。我怀疑答案将同时适用于 SQL 以及 PL/SQL。 【参考方案1】:REGEXP_REPLACE()
替换了一个 pattern,因此虽然它对于查找要替换的内容很有用,但不能用相同长度的内容替换已删除的字符串。
以下内容将替换 HTML:
regexp_replace(str, '</?FONT.*>')
然后您需要在已删除字符串的长度上加上问号,即删除前的字符串长度减去现在的字符串长度。
不幸的是,我不确定是否有解决此问题的好方法。您必须使用一个字符来通知您,一旦字符串被替换,这就是问号所在的位置。像下面这样的会工作:
replace( regexp_replace(str, '</?FONT.*>', '?')
, '?'
, lpad( '?'
, length(str) - length(regexp_replace(str, '</?FONT.*>', '?')) - 1
, '?'
)
)
我真的不喜欢它...如果整个内容是 HTML,那么使用适当的解析器会更容易更好,然后您可以替换一个节点中的所有数据。
【讨论】:
【参考方案2】:虽然我喜欢 PL/SQL,但我不建议这样做。 PL/SQL 强大的数据操作工具,但对解析不太方便。这是 Java 存储过程可以更高效的示例。尤其是当您必须多次重构代码时。
REGEX_REPLACE
也适用于 VARCHARs
(最大大小 32KB),而您可能需要使用 CLOB。
【讨论】:
【参考方案3】:我写了一个函数,它比 Ben 的代码更容易理解,但可能效率较低,当然也不那么优雅。我还没决定用哪个,你觉得呢?
FUNCTION REPLACE_WITH_PLACEHOLDER(IN_STRING IN VARCHAR2, START_STRING IN VARCHAR2, END_STRING IN VARCHAR2, PLACEHOLDER IN VARCHAR2) RETURN VARCHAR2
IS
OUT_STRING VARCHAR2(32767);
START_POSITION BINARY_INTEGER := 0;
END_POSITION BINARY_INTEGER;
SEARCH_LENGTH BINARY_INTEGER;
SEARCH_STRING VARCHAR2(500);
REPLACE_STRING VARCHAR2(500);
BEGIN
OUT_STRING := IN_STRING;
START_POSITION := INSTR(OUT_STRING,START_STRING);
WHILE START_POSITION > 1
LOOP
END_POSITION := INSTR(OUT_STRING,END_STRING,START_POSITION) + LENGTH(END_STRING);
IF END_POSITION > 0
THEN
SEARCH_LENGTH := (END_POSITION - START_POSITION);
SEARCH_STRING := SUBSTR(OUT_STRING,START_POSITION,SEARCH_LENGTH);
REPLACE_STRING := LPAD(PLACEHOLDER,SEARCH_LENGTH,PLACEHOLDER);
OUT_STRING := REPLACE(OUT_STRING,SEARCH_STRING,REPLACE_STRING);
ELSE
EXIT;
END IF;
START_POSITION := INSTR(OUT_STRING,START_STRING);
END LOOP;
RETURN OUT_STRING;
END REPLACE_WITH_PLACEHOLDER;
【讨论】:
以上是关于如何使用 PL/SQL 正则表达式将 HTML 标记及其内容替换为相同数量的“?s”?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用正则表达式或任何其他方法在 PL/SQL 中提取单引号内的字符串 [重复]
在 PL/SQL Developer Find & Replace 中使用正则表达式模式时,如何访问匹配的对象以进行替换?