代码之家  ›  专栏  ›  技术社区  ›  user3713929

如何在MySQL的freetext字段中找到特定域的所有URL实例?

  •  0
  • user3713929  · 技术社区  · 4 年前

    我有一个MySQL数据库和一个自由文本字段,其中有一堆自由文本,可能还有URL。

    我希望能够找到以“开始”开头的URLhttps://hotspot.com“,获取完整的URL,以及内容中的任何实例。例如,如果我们在同一个字段中有3个URL,我希望获取所有3个URL。

    这张桌子看起来像:

    CREATE TABLE IF NOT EXISTS `sample` (
      `id` int(6) unsigned NOT NULL,
      `content` varchar(200) NOT NULL,
      PRIMARY KEY (`id`)
    ) DEFAULT CHARSET=utf8;
    INSERT INTO `sample` (`id`, `content`) VALUES
      ('1', 'chimichangas and stuff https://hotspot.com/files/filename.pdf'),
      ('2', 'One hundred angels can dance on the head of a pin'),
      ('3', 'The last unihorn https://hotspot.com/files/anotherfile.pdf and its so cool https://hotspot.com/files/morefile.png'),
      ('4', 'The earth is like a ball. https://yahoo.com/files/filename/pdf');
    

    我想买些

    1. https://hotspot.com/files/filename.pdf

    3. https://hotspot.com/files/anotherfile.pdf

    3. https://hotspot.com/files/morefile.png

    (内容的id,以及它在其中找到的URL。尽管格式并不重要,只要我得到信息) 我试图通过子字符串_索引获得它,下面是我发现的一些示例。但我不确定我是否理解他们。例如: Extract multiple URL of Text from MySQL column

    0 回复  |  直到 4 年前
        1
  •  0
  •   Kristian A.BEN    4 年前

    你在REGEXP_SUBSTR上的尝试奏效了。我不知道为什么它会返回0行,但这是我的工作示例,我只是拿你的做一点修改:

    SELECT
    REGEXP_SUBSTR(content,'(https?:\/\/([A-Za-z0-9]+?\.)?hotspot\.com(\/[A-Za-z0-9\-\._~:\/\?#[@\]!$&()*\+,;\=]*)?)',1,1),
    REGEXP_SUBSTR(content,'(https?:\/\/([A-Za-z0-9]+?\.)?hotspot\.com(\/[A-Za-z0-9\-\._~:\/\?#[@\]!$&()*\+,;\=]*)?)',1,2),
    REGEXP_SUBSTR(content,'(https?:\/\/([A-Za-z0-9]+?\.)?hotspot\.com(\/[A-Za-z0-9\-\._~:\/\?#[@\]!$&()*\+,;\=]*)?)',1,3),
    REGEXP_SUBSTR(content,'(https?:\/\/([A-Za-z0-9]+?\.)?hotspot\.com(\/[A-Za-z0-9\-\._~:\/\?#[@\]!$&()*\+,;\=]*)?)',1,4)
    FROM sample
    

    结果:

    可乐1 可乐2 可乐3 可乐4
    https://hotspot.com/files/filename.pdf 无效的
    无效的 无效的 无效的 无效的
    https://hotspot.com/files/anotherfile.pdf https://hotspot.com/files/morefile.png 无效的 无效的
    无效的 无效的 无效的 无效的

    说明:

    REGEXP_SUBSTR参数是

    • 要匹配的字符串
    • 正则表达式模式
    • 起始索引
    • 发生指数

    通过选择1-4个索引,我们可以在一行中捕获多达4个url

    如果你认为会有更多,你可以添加更多的列

    我改变了什么:

    之前:

    (https?:\/\/(.+?\.)?hotspot\.com(\/[A-Za-z0-9\-\._~:\/\?#[]@!$&'()*\+,;\=]*)?)

    之后:

    (https?:\/\/([A-Za-z0-9]+?\.)?hotspot\.com(\/[A-Za-z0-9\-\._~:\/\?#[@\]!$&()*\+,;\=]*)?)

    我刚换了你的衣服 (.+?\.)? 进入 ([A-Za-z0-9]+?\.)? 为了防止在一个字符串中有多个url时贪婪地匹配所有url(我猜这个捕获组是用于匹配hotspot.com的子域)