regex - 如何使用 PostgreSQL 从任何 URL 中提取顶级域

标签 regex postgresql url tld

我想获取一组相对适中的 URL,并使用一个(或多个,如果需要)PostgreSQL 查询将它们解析为顶级域。

看起来主要的步骤如下:

  1. 找出URL中所有“/”的个数和位置
  2. 如果'/'的个数>3,则删除所有到 第三个'/'右边(包括最后一个'/')
  3. 计算“.”的数量出现在第 1-2 步保留的 URL 中。
  4. 如果“.”的#是 1,然后简单地删除“://”之前的任何内容。
  5. 如果“.”的# > 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/

相关文章:

postgresql - POSTGIS - 从另一个表更新表

json - 为 Postgres JSON 文档生成 UUID

ios - 从 Swift 中的 URL 中删除所有路径组件

laravel - 在 Laravel 5.4 中从 URL 中删除 '/public' 的安全方法

php - 如果我使用以下内容,正则表达式是否用于表单验证?

javascript - 具有双字符的字符范围的正则表达式

python - Django 和 postgres : Not connecting

facebook - 如何清除电子邮件回复中被阻止的 URL

javascript - 使用子字符串 javascript 获取与字符串的匹配

regex - 这个正则表达式模式会捕获所有需要的 SQL 注入(inject)吗?