我想获取一组相对适中的 URL,并使用一个(或多个,如果需要)PostgreSQL 查询将它们解析为顶级域。
看起来主要的步骤如下:
- 找出URL中所有“/”的个数和位置
- 如果'/'的个数>3,则删除所有到 第三个'/'右边(包括最后一个'/')
- 计算“.”的数量出现在第 1-2 步保留的 URL 中。
- 如果“.”的#是 1,然后简单地删除“://”之前的任何内容。
- 如果“.”的# > 1,然后找到最大的'.'然后提取 第一个“。”之间的文本以及新的最大字符串长度。
我已经找到了几个例子: (一) http://www.postgresql.org/message-id/247444.36947.qm@web50311.mail.re2.yahoo.com (二) http://www.seanbehan.com/extract-domain-names-from-links-in-text-with-postgres-and-a-single-sql-query
但这些似乎都无法正常工作——我正在查询 redshift 数据库,当我尝试执行时收到“功能未实现”错误。
虽然在 Python 或其他语言中有很多方法可以做到这一点,但我还没有找到专门针对 PostgreSQL 的 SO 解决方案。
最佳答案
假设您的网址有一个方案,您是否尝试过类似的方法:
select substring( 'http://www.arandomsite.com' from '^[^:]*://(?:[^/:]*:[^/@]*@)?(?:[^/:.]*\.)+([^:/]+)' ) as tld;
详情:
^ # anchor for the start of the string
[^:]*:// # the scheme
(?:[^/:]*:[^/@]*@)? # optional "user:password@"
(?:[^/:.]*\.)+ # other parts of the hostname
([^:/]+) # tld (note that the ":" is excluded too, to avoid to match the port)
注意:如果 url 的主机名是 ipv4 或 ipv6,显然这不起作用。
关于regex - 如何使用 PostgreSQL 从任何 URL 中提取顶级域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31227081/