2017-03-27 54 views
1

對於我們高度特定的用例,有點奇怪的Postgresql問題。我們有一個表格,它接受URL作爲用戶評論輸入的一部分。這是一個高度販賣的網站。我們有一些PHP代碼用於驗證用戶是否只輸入了正確的URL,如果他們在評論中包含了一個URL(通常評論文本不包含任何URL)。刪除已輸入無效「URL」的表中的所有行

但是,不幸的是,我們的PHP在舊的服務器上老舊。所以在某些時候,我們已經失去了邏輯。這意味着惡棍用戶有一個重要的日子進入與類似下面的格式錯誤的網址評論:

l%20are%20generally%20included%20almost%20anyplace--even%20if%20your%20"yard"%20is%20bound%20to%20an%20outdoor%20patio%20or%20balcony.Adding%20water%20to%20your%20patio%20could%20be%20as%20simple%20as%20aiming%20a%20low%20dish%20of%20water%20designed%20for%20use%20in%20the%20form%20of%20birdbath.Any%20cursory%20container%20around%206%20in%20.wide%20and%20a%20half-inch%20deep%20will%20attempt%20to%20work.Pie%20pans,%20garbage%20can%20lids,%20or%20flo 

請注意,這不是一個URL的。因此,我們的問題是:是否有Postgresql的唯一方式,可能通過某些PL/SQL函數或某些存儲的函數或某些東西,我們可以使用它們從數據庫中刪除所有這些垃圾記錄?理想情況下,我們不希望使用遍歷整個數據庫的PHP程序,並根據有效的URL模式進行檢查。

我們希望在PG本身內執行此操作。只要需要,我們可以使數據庫脫機執行此任務。

謝謝!

+0

你能給一個正確的URL的例子,也許另一個又是錯誤的嗎? –

+0

謝謝安東尼。有效的URL以'http'或'https'或'ftp'或'sftp'開頭,然後是通常的URI驗證。後者是通常的URI資料,可以在線獲取PHP等。我還沒有看到pgsql的任何存儲函數。 –

回答

1
SELECT * FROM table WHERE url_column !~* '(https?|ftp)://(-\.)?([^\s/?\.#-]+\.?)+(/[^\s]*)?' 

試試這個查詢,驗證輸出en然後你可以用這個例子創建一個DELETE查詢。

+0

謝謝,但這似乎會返回以「http://」開頭的有效網址。也許正則表達式不正確?但是,感謝你的這個方向,這聽起來很有希望! –

+1

(https?| ftp)應該照顧那個, http之後「s」表示https中的s不是強制性的。你能用「(http | https | ftp)」來試試它嗎?我已經使用PgSQL 9.1驗證了該查詢,您使用的是哪個版本? – riekelt

+0

我在PG 9.0上。不起作用。 –