2017-05-04 108 views
1

我有一個數據庫,其中包含一系列獨特的URL,它們都包含帶有「://」的前導http或https。 。一些網址還在字符串中增加了「//」。PHP/MYSQL搜索多個子字符串(反斜槓)並修復數據行

我有三個問題需要解決。

首先,我需要找到所有具有額外雙向正斜槓的行,並且不會從前導http獲得誤報。第二,我需要str_replace「/」與「/」而不影響領先的「http://」和「https://」,以便我可以更新該行。

第三,刪除行,如果它是重複的,因爲行已經被插入沒有雙正斜槓。

我不知道如何跳過MYSQL命令中第一次出現「//」......非常確定我可以自己解決其他兩個問題,如果我能夠過去找到不好的網址。

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

['parse_url()'](http://php.net/manual/en/function.parse -url.php)可能對你有些用處...... –

+0

雙向轉發已經在數據庫中。所以我正在尋找一種方法在mysql中識別它們。 parse_url在它們被插入之前工作,但是在每次更新和檢查時運行整個數據庫都沒有意義。 – Wolfe

+2

'WHERE url LIKE'http://%//%'or url LIKE'https://%//%'' – AbraCadaver

回答

1

查找http://https://也有//某處它

OR

查找不http:// AND NOT https://,在它


WHERE 
     (url LIKE 'http://%//%' OR url LIKE 'https://%//%') 
    OR 
     (url NOT LIKE 'http://%' AND url NOT LIKE 'https://%' AND url LIKE '%//%') 
具有 //某處

這將用於查找行但不能替換。

+0

接受更長的不完整答案! – cgTag

+0

順便說一句,我需要在第二行更多的% – AbraCadaver

1

首先,我需要找到所有具有額外雙向正斜槓的行,並且不會從前導http獲得誤報。

使用LOCATE方法,但從字符串中的第7個字符開始。這既是http://https:/

LOCATE('//', `url`, 7) != 0 

秒鐘後,我需要str_replace函數的 「//」 和 「/」,而不影響領導的 「http://」 和 「https://開頭」,所以我可以更新該行。

首先將://替換爲:\/\/,然後進行替換。之後回覆:\/\/

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

第三,刪除該行,如果它是一個重複的,因爲沒有雙斜槓行已經插入。

如果你不關心哪兩個記錄被刪除。最簡單的方法是創建一個唯一索引,強制MySQL刪除重複項。

ALTER IGNORE TABLE `my_table` ADD UNIQUE INDEX `url`; 

注意使用忽略它告訴MySQL不觸發重複的錯誤。

然後,您可以放下索引。

+0

'ALTER IGNORE'在MySQL 5.7.4中被刪除。 – diesieben07

-1

MySQL支持完全正則表達式,所以你也可以搭配http(s)前綴是:

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