如何使用 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 正则表达式检查

在 PL/SQL Developer Find & Replace 中使用正则表达式模式时,如何访问匹配的对象以进行替换?

正则表达式:如何在 PL/SQL 中实现负向后查找

pl/sql 正则表达式验证

替换 PL/SQL 中的几行正则表达式函数