使用正则表达式替换XML输出中包含的标记之间的所有内容

时间:2013-02-22 13:55:40

标签: regex plsql

我一直在搜索互联网,试图找到解决这个问题的方法。基本上我使用运行我们的支持软件的公司提供的Web服务来检索客户票并通过我们的系统输出它们(取决于过滤),以便客户可以从他们的仪表板上看到他们当前支持的活动票。我已经设法从通过Web服务返回的XML中获取所需的标记,并将其内容放在html表中(因此在表中逐行列出活动票证)但是,因为票证描述标记填充了来自客户端发送的电子邮件的内容,有很多令人讨厌的冗余css和样式已应用于我想删除的电子邮件。

到目前为止,我已设法使用'替换'功能替换此电子邮件内容中的一些冗余内容 - >

        l_html_build := replace(l_html_build,'&lt;','<');
        l_html_build := replace(l_html_build,'&gt;','>');
        l_html_build := replace(l_html_build,'&amp;lt;','');
        l_html_build := replace(l_html_build,'&amp;gt;','');
        l_html_build := replace(l_html_build,'&amp;nbsp;','&nbsp;');

但是我现在需要覆盖添加了各种垃圾的p标签,以便它们成为标准的p标签 - &gt;

    From this:
    <p 0in;&quot;="" 3.0pt="" padding:="" 1.0pt;="" solid="" border-top:="" none;="" _mce_style=""border:" 0in&quot;="" 0in="" 1.0pt;padding:3.0pt="" #b5c4df="" style=""border:none;border-top:solid">

    To this:
    <p>

我已经研究过使用此处列出的regEXP函数psoug但是这似乎需要每次执行的select语句。我需要操作的数据存储在一个名为l_html_build的CLOB中,所以有什么方法可以调整regEXP函数以类似于上面替换函数的方式使用,还是有一种我不知道的替代方法?

如果这是一个菜鸟问题,我道歉。我的专长在于前端开发,PHP和MySQL,但不幸的是我现在需要在我的新角色中使用PL / SQL。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

知道:

你剩下的选择很少(我能想到):

  1. 自己编写一个简单的程序,可以在大多数情况下使用(但会有许多异常会破坏你的解析器)。
  2. 使用java解析器,在数据库中加载类,从PL / SQL调用java。 Oracle带有集成的jvm,因此无需额外设置。
  3. 如果您需要可靠性,我会选择选项(2),如果不经常但不可避免的损失可以接受,我会选择选项(1)。


    由于您的内容将来自电子邮件客户端,我们可以假设只有一小部分(可忽略的?)部分会有非常模糊的HTML。

    在这种情况下,您可以从可能需要进行一些调整的简单正则表达式开始:

    SQL> SELECT regexp_replace(
      2  '<p1 3.0pt="" padding:="" #b5c4df="">
      3  text
      4  </p>',
      5                        '<([[:alpha:]]+)[^>]*>',
      6                        '<\1>') remove_attr_simple
      7    FROM dual;
    
    REMOVE_ATTR_SIMPLE
    ------------------
    <p>
    text
    </p>
    

    这将无法捕获棘手的有效HTML(例如<P attr=">">),但由于您的输入有些标准,因此这应该很好。您可能需要使用其他过程删除HTML注释 - 我不确定是否可以使用正则表达式完成。

答案 1 :(得分:1)

SQL实际上不是这项工作的最佳工具。正则表达式也不能可靠地执行此类任务。您最好使用XML解析器提取数据并使用其他语言处理数据。

据推测,Oracle本身并未发送这些电子邮件。发送什么程序,你能在那时添加一些程序化处理吗?

由于您已经了解PHP,here is a discussion of parsing HTML/XML in PHP。大多数其他语言都提供类似的工具。