PostgreSQL - 替换HTML实体

lyn*_*nks 4 regex sql postgresql replace

我刚刚开始从我们的数据库中删除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%';
Run Code Online (Sandbox Code Playgroud)

这显然是一种非常天真的方法.我一直试图弄清楚我能用解码功能做些什么聪明的事情; 也许通过正则表达式像抓住了HTML实体/&#x(..);/,然后通过刚刚%1部分到ASCII解码器,以及重建串...或东西...

我应该继续查询吗?可能只有40左右.

Szy*_*ski 6

使用pl/perlu编写函数并使用此模块https://metacpan.org/pod/HTML::Entities

当然你需要安装perl和pl/perl.

1) 首先创建过程语言pl/perlu:

CREATE EXTENSION plperlu;
Run Code Online (Sandbox Code Playgroud)

2)然后创建一个这样的函数:

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

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

select decode_html_entities('aaabbb&.... asasdasdasd …');
   decode_html_entities    
---------------------------
 aaabbb&.... asasdasdasd …
(1 row)
Run Code Online (Sandbox Code Playgroud)


Ste*_*ger 6

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

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