您将如何在 PostgreSQL 中去除 HTML 标签以保留标签内的数据?
我通过谷歌搜索找到了一些解决方案,但他们也在标签之间删除了文本!
select regexp_replace(content, E'<[^>]+>', '', 'gi') from message;
为您的数据库提供XML 数据类型,而不是“第二类”文本,因为将 HTML 转换为 XHTML 非常简单(请参阅 HTML-Tidy 或标准 DOMloadHTML()
和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.net、eskpee.wordpress和Stackoverflow上查看这个和许多其他变体。
选择不仅限于使用基于不充分的正则表达式的弱解析器在服务器端执行它,或者使用强大的解析器在客户端执行它。它也可以通过强大的解析器在服务器端实现。
这是一个利用CPAN 的HTML 模块的 PL/PerlU 示例。
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 ---------------------------- 你好呀! 你好吗?
不过,需要注意不受信任的语言带来的警告。
在 RDBMS 中执行的任何解决方案都将涉及字符串处理或正则表达式:据我所知,没有办法在数据库中以符合标准、安全的方式操作 HTML。重申一下,您所要求的非常非常不安全。
更好的选择是在您的应用程序中执行此操作。这是应用程序逻辑,而不是存储层的工作或关注点。
一个很好的方法(至少在 PHP 中)是HTML 净化器。 不要在 JavaScript 中这样做,用户很容易篡改它。
regexp_replace("Content",'\s*(<[^>]+>|<script.+?<\/script>|<style.+?<\/style>)\s*','','gi')
这段代码对我来说效果很好,它删除了常见的 html-tags 并保留了内部文本(如一些文本),并删除了脚本、样式块并删除了内部代码。
不要在 postgreSQL 中这样做。
它不是为此而设计的。
使用 PHP 或您使用的任何语言来提供网页。
不过要小心正则表达式。HTML 是一种复杂的语言,无法用正则表达式来描述。
使用 DOM 解析器去除标签。
如果你使用正则表达式,可以保证你没有留下任何不安全的东西,但是你可以很容易地去掉你想要的东西,或者它可能会留下格式错误的标签。