PostgreSQL的 - 替换HTML实体(PostgreSQL - Replace HTML E

2019-06-27 10:42发布

我刚才已经着手从我们的数据库中剥离出来的HTML实体的任务,因为我们做了很多抓取和一些爬虫并没有在输入时间做到这一点:(

于是我开始写一堆看起来像查询;

UPDATE nodes SET name=regexp_replace(name, 'à', 'à', 'g') WHERE name LIKE '%#xe0%';
UPDATE nodes SET name=regexp_replace(name, 'á', 'á', 'g') WHERE name LIKE '%#xe1%';
UPDATE nodes SET name=regexp_replace(name, 'â', 'â', 'g') WHERE name LIKE '%#xe2%';

这显然是一个非常幼稚的做法。 我一直在试图找出是否有一些聪明我可以用解码功能做; 也许通过正则表达式抓住HTML实体喜欢/&#x(..);/ ,然后只是路过%1部分将ASCII解码器,以及重建串...或东西...

我将只按上查询? 有可能只有40个左右的人。

Answer 1:

使用PL / perlu编写一个函数,使用这个模块https://metacpan.org/pod/HTML::Entities

当然,你需要安装Perl和PL / perl的使用。

1)首先创造的过程语言PL / perlu:

CREATE EXTENSION plperlu;

2)然后,创建这样的功能:

CREATE FUNCTION decode_html_entities(text) RETURNS TEXT AS $$
    use HTML::Entities;
    return decode_entities($_[0]);
$$ LANGUAGE plperlu;

3)然后你可以使用它像这样:

select decode_html_entities('aaabbb&.... asasdasdasd …');
   decode_html_entities    
---------------------------
 aaabbb&.... asasdasdasd …
(1 row)


Answer 2:

您可以使用XPath(HTML编码的内容是相同的XML编码的内容):

select 
  'AT&T' as input ,
  (xpath('/z/text()', ('<z>' || 'AT&amp;T' || '</z>')::xml))[1] as output 


文章来源: PostgreSQL - Replace HTML Entities