剥离PostgreSQL中的HTML标记

时间:2012-08-21 07:10:00

标签: regex postgresql

如何在PostgreSQL中删除HTML标签,以便保留标签内的数据?

我通过Google搜索找到了一些解决方案,但他们也在标签之间删除了文字!

6 个答案:

答案 0 :(得分:10)

使用xpath

使用XML datatype提供数据库,而不是使用“第二类”TEXT,因为将HTML转换为XHTML非常简单(请参阅HTML-Tidy或标准DOM的loadHTML()saveXML()方法)。

!它很快且非常安全!

共同信息检索需要,不是完整内容,而是XHTML中的内容,因此xpath的强大功能很受欢迎。

示例:使用class="fn"

检索所有段落
  WITH needinfo AS (
    SELECT *, xpath('//p[@class="fn"]//text()', xhtml)::text[] as frags
    FROM t 
  ) SELECT array_to_string(frags,' ') AS my_p_fn2txt
    FROM needinfo
    WHERE array_length(frags , 1)>0
  -- for full content use xpath('//text()',xhtml)

正则表达式解决方案......

我不推荐,因为它不是一个“信息检索”解决方案......而且,正如@James和其他人在这里评论的那样,正则表达式解决方案并非如此。

我喜欢“纯SQL”,对我来说比使用Perl(se @ Daniel的解决方案)或其他更好。

 CREATE OR REPLACE FUNCTION strip_tags(TEXT) RETURNS TEXT AS $$
     SELECT regexp_replace(
        regexp_replace($1, E'(?x)<[^>]*?(\s alt \s* = \s* ([\'"]) ([^>]*?) \2) [^>]*? >', E'\3'), 
       E'(?x)(< [^>]*? >)', '', 'g')
 $$ LANGUAGE SQL;

siafoo.neteskpee.wordpress,...和here at Stackoverflow上查看此内容以及许多其他变体。

答案 1 :(得分:9)

select regexp_replace(content, E'<[^>]+>', '', 'gi') from message;

答案 2 :(得分:8)

选择不仅限于使用基于不充分的正则表达式的弱解析器在服务器端执行,或者使用强大的解析器在客户端执行它。它也可以通过强大的解析器在服务器端实现。

以下是PL / PerlU中利用CPAN's HTML模块的示例。

CREATE FUNCTION extract_contents_from_html(text) returns text AS $$
  use HTML::TreeBuilder;
  use HTML::FormatText;
  my $tree = HTML::TreeBuilder->new;
  $tree->parse_content(shift);
  my $formatter = HTML::FormatText->new(leftmargin=>0, rightmargin=>78);
  $text = $formatter->format($tree);
$$ LANGUAGE plperlu;

演示:

select extract_contents_from_html('<html><body color="white">Hi there!<br>How are you?</body></html>') ;

输出:

     extract_contents_from_html 
    ----------------------------
     Hi there!
     How are you?

但是,需要注意不受信任的语言附带的caveats

答案 3 :(得分:6)

在RDBMS中执行的任何解决方案都将涉及字符串处理或正则表达式:据我所知,没有办法在数据库中以符合标准的安全方式操作HTML。重申一下,你要求的是非常非常不安全。

更好的选择是在您的应用程序中执行此操作。这是应用程序逻辑,而不是存储层的工作或关注。

这样做的好方法(至少在PHP中)是HTML purifier. 不要在JavaScript中执行此操作,用户可以非常轻松地篡改它。

答案 4 :(得分:0)

不要在postgreSQL中这样做。

它不是为此而设计的。

使用PHP或您使用的任何语言来提供网页。

虽然注意正则表达式。 HTML是一种复杂的语言,无法使用正则表达式进行描述。

使用DOM解析器去除标记。

如果你使用正则表达式,可以保证你不会留下任何不安全的东西,但你可以很容易地删除超出你想要的东西,或者它可能留下格式错误的标签。

答案 5 :(得分:0)

regexp_replace("Content",'\s*(<[^>]+>|<script.+?<\/script>|<style.+?<\/style>)\s*','','gi')

这段代码对我来说效果很好,它删除了常见的 html 标签并保留了内部文本(喜欢一些文本), 并删除脚本、样式块,并删除内部代码。