如何从MySQL中删除字符串中的URL?

时间:2015-03-12 14:55:02

标签: mysql sql

我需要从SQL查询的结果中删除网址。所有网址看起来都像http://,因此不需要复杂的正则表达式。但网址可以是字符串中的任何位置。

示例:

alpha beta http://alphabeta.com/abc
gamma http://gammadel.com/def delta
http://epsilo.com/ghi epsilon theta

如何从结果中删除这些网址以获取以下内容?

alpha beta
gamma delta
epsilon theta

注意:

  1. 网址(在我的用例中)执行始终以http://开头。
  2. 每个字符串只找到一个网址
  3. 理想情况下,解决方案不需要额外的库

3 个答案:

答案 0 :(得分:2)

由于您无法使用preg_replace这样的功能而没有任何插件/库 - 并且您只使用mysql / sql标记了您的问题,因此您需要需要安装它才能让你使用正则表达式替换。 https://github.com/mysqludf/lib_mysqludf_preg#readme

现在已安装,您可以运行;

SELECT CONVERT( 
   preg_replace('/(http:\/\/[^ \s]+)/i', '', foo)  
USING UTF8) AS result 
FROM `bar`;

这会产生如下结果:https://regex101.com/r/qX6jB8/1

答案 1 :(得分:2)

怎么样?
SELECT REPLACE(
  'alpha gamma http://gammadel.com/def delta beta', 
  CONCAT('http://', 
    SUBSTRING_INDEX(
      SUBSTRING_INDEX('alpha gamma http://gammadel.com/def delta beta', 'http://', -1),' ', 1)
  ),''
);

我已经对您提供的字符串进行了测试,但不确定它是否完全符合您的要求。

基本上这段代码的作用是:

  1. 使用SUBSTRING_INDEX()函数提取网址
  2. 用原始字符串中的空字符串替换URL。
  3. 这是一个完整的查询来测试每个场景:

    SET @str1="foo bar http://foobar.com/abc";
    SET @str2="foo http://foobar.com/def bar";
    SET @str3="http://foobar.com/ghi foo bar";
    SELECT
        REPLACE(
            @str1, 
            CONCAT('http://', 
                SUBSTRING_INDEX(
                    SUBSTRING_INDEX(@str1, 'http://', -1),
                    ' ', 1
                )
            ),''
        ) AS str1,
        REPLACE(
            @str2, 
            CONCAT('http://', 
                SUBSTRING_INDEX(
                    SUBSTRING_INDEX(@str2, 'http://', -1),
                    ' ', 1
                )
            ),''
        ) AS str2,
        REPLACE(
            @str3, 
            CONCAT('http://', 
                SUBSTRING_INDEX(
                    SUBSTRING_INDEX(@str3, 'http://', -1),
                    ' ', 1
                )
            ),''
        ) AS str3
    ;
    

    返回(按预期):

    foo bar
    foo bar
    foo bar
    

答案 2 :(得分:0)

+1代表Jakub(功能为+10,娱乐性为-9)。我正在发布他的回答的这种可憎的内容,这样我就不会丢失它,并且可以节省一个人的时间。

采用varchar(255)的零件号字段和带有varchar(255)的描述字段的concat,修剪,剥离链接,剥离新行,防止零件号在描述中重复,并将其格式化以插入2个连续的char(30)个字段...

SELECT SUBSTRING(
    TRIM(CONCAT(
        CONCAT(
            TRIM(REPLACE(REPLACE(REPLACE(REPLACE(
                pi.part_number, CONCAT('https://', SUBSTRING_INDEX(SUBSTRING_INDEX(pi.part_number, 'https://', -1), ' ', 1)), ''
            ), CONCAT('http://', SUBSTRING_INDEX(SUBSTRING_INDEX(pi.part_number, 'http://', -1), ' ', 1)), ''), '\n', ''), '\r', ''))
            , ' '
        ),
        TRIM(REPLACE(
            REPLACE(REPLACE(REPLACE(REPLACE(
                pi.description, CONCAT('https://', SUBSTRING_INDEX(SUBSTRING_INDEX(pi.description, 'https://', -1), ' ', 1)), ''
            ), CONCAT('http://', SUBSTRING_INDEX(SUBSTRING_INDEX(pi.description, 'http://', -1), ' ', 1)), ''), '\n', ''), '\r', ''),
            TRIM(pi.part_number), ''
        ))
    ))
    , 1, 30
) AS PDDSC1,
SUBSTRING(
    TRIM(CONCAT(
        CONCAT(
            TRIM(REPLACE(REPLACE(REPLACE(REPLACE(
                pi.part_number, CONCAT('https://', SUBSTRING_INDEX(SUBSTRING_INDEX(pi.part_number, 'https://', -1), ' ', 1)), ''
            ), CONCAT('http://', SUBSTRING_INDEX(SUBSTRING_INDEX(pi.part_number, 'http://', -1), ' ', 1)), ''), '\n', ''), '\r', ''))
            , ' '
        ),
        TRIM(REPLACE(
            REPLACE(REPLACE(REPLACE(REPLACE(
                pi.description, CONCAT('https://', SUBSTRING_INDEX(SUBSTRING_INDEX(pi.description, 'https://', -1), ' ', 1)), ''
            ), CONCAT('http://', SUBSTRING_INDEX(SUBSTRING_INDEX(pi.description, 'http://', -1), ' ', 1)), ''), '\n', ''), '\r', ''),
            TRIM(pi.part_number), ''
        ))
    ))
    , 31, 30
) AS PDDSC2
FROM purchase_request_items pi