PHP / MYSQL搜索多行子字符串(forwardslashes)和修复的行

时间:2017-05-04 19:20:27

标签: php mysql

我有一个包含一系列唯一网址的数据库,所有这些网址都包含带有"://"的前导http或https。在里面。一些网址还有额外的" //"用字符串。

我有三个需要解决的问题。

首先,我需要使用url查找带有额外双正斜杠的所有行,而不会从前导http中获得误报。

其次,我需要str_replace" //"用" /"没有影响领先" http://"和" https://"所以我可以更新一行。

和第三个,如果该行是重复的,则删除该行,因为该行已被INSERTed而没有双正斜杠。

我不知道如何跳过第一次出现" //"在MYSQL命令中......如果我能找到错误的网址,我可以自己解决其他两个问题。

$sql = "SELECT * FROM `search` WHERE `url` NOT LIKE 'http://' 
        OR NOT LIKE 'https://' AND LIKE '%//%'" ;

3 个答案:

答案 0 :(得分:0)

在其中的某处找到http://https://或<{p}}

在其中某处//找不到http://而不是https://

//

这将用于查找行但不能替换。

答案 1 :(得分:0)

  

首先,我需要使用url查找带有额外双正斜杠的所有行,而不会从前导http中获得误报。

使用Bug.State方法,但从字符串中的第7个字符开始。这是在LOCATEhttp://

之后
https:/
  

其次,我需要使用“/”str_replace“//”而不影响前导“http://”和“https://”,以便我可以更新该行。

首先用 LOCATE('//', `url`, 7) != 0 替换://,然后进行替换。之后还原:\/\/

:\/\/
  

和第三个,如果该行是重复的,则删除该行,因为该行已被INSERTed而没有双正斜杠。

如果您不关心哪两条记录被删除。最简单的方法是创建一个强制MySQL删除重复项的唯一索引。

 REPLACE(REPLACE(REPLACE(`url`,'://',':\/\/'),'//','/'),':\/\/','://')

请注意 ignore 的使用,它告诉MySQL不要在重复项上触发错误。

然后您可以删除索引。

答案 2 :(得分:-1)

MySQL支持完整的正则表达式,因此您也可以将http(s)前缀与此匹配:

SELECT ... WHERE url RLIKE 'https?://.*//.*';