2009-11-10 58 views
10

我有一個匹配MySQL中的字段,我認爲我可以使用正則表達式,但似乎MySQL沒有我需要的功能來完成這項工作。這裏是場景:有沒有PHP的preg_replace的MySQL等價物?

我在PHP中有一個名爲$ url的變量。假設這個變量被設置爲字符串「/ article/my-article/page/2」。我也有一個MySQL的URL表格,我想從中提取內容。但是,存儲在我的表中的URL包含通配符。

以前,我設置了這個值,以便表中存儲的值如下所示:「/ article /%/ page /%」。

通過這種結構,我可以只運行:

SELECT * FROM urls WHERE '$url' LIKE url 

,這將匹配,這是所期望的功能。

我現在想要做的是允許使用更高級的通配符,而不是「/ article /%/ page /%」,我的MySQL數據可能是「/ article/{{slug}} /頁/ {{page_no}}」。

我想使用相同的$ url輸入創建一個匹配這個數據的SQL查詢。 LIKE不再是正確的比較,因爲我沒有使用內置的「%」通配符,而是使用{{。*}}。任何想法如何做到這一點?

回答

-1

我找到了解決方案。這並不理想,但我會把它放在這裏,以防萬一純粹的SQL解決方案從未出現。我可以將MySQL中的url字段保留爲「/ articles /%/ page /%」,並添加另一個稱爲變量的字段,用於存儲要使用的變量名稱列表。這樣我可以使用我的原始查詢,然後在檢索數據後,用sprintf在PHP中用「{{variable}}」替換返回值中的「%」字符。

不過,如果可能的話,我希望看到在SQL中解決這個問題,因爲我認爲這個概念很有價值。

4

這聽起來像你想要做的就是在,URL中有你會傳遞到佔位符數據庫中的新語法是什麼你的基於php的(sprintf)變量替換代碼,但仍然能夠進行原始比較以匹配URL。

如果我理解正確的話,你要採取新的網址格式

/article/{{slug}}/page/{{page_no}} 

,並匹配它像

/article/my-article/page/2 

提到可以做你需要的替代預浸插件鷺,這將將其中一個新格式化的URL轉換爲您用來使用LIKE語法確定匹配的原始格式。下面的查詢:

SELECT PREG_REPLACE('/({{.*?}})/', '%', `url`) FROM urls; 

會變成新的URL(/條/ {{塞}} /頁/ {{page_no}})到它本來

/article/%/page/% 

然後可以反饋通過您的原始查詢,像這樣:

SELECT * FROM urls 
WHERE '/article/my-article/page/2' LIKE preg_replace('/({{.*?}})/', '%', `url`); 

像MAMP,XAMMP等一些二進制分發版中已經安裝了插件,但它不是在很多類似的MacPorts/Ubuntu的系統上安裝。這裏有一些關於安裝preg插件的文章。希望能幫助到你。

http://quickshiftin.com/blog/2011/04/installing-mysql-preg-plugin-osx-macports/

http://quickshiftin.com/blog/2011/12/installing-the-mysql-preg-plugin-on-ubuntu-with-apt-get/

+1

這是正確的答案。 – dotancohen 2013-11-13 14:43:02

3

用戶上面提到http://www.mysqludf.org/lib_mysqludf_preg/但這個答案是非常古老最教程中,我想在這個擴大的新人着想,這個問題。

首先,圖書館是真正偉大的,從經驗上講,我可以說,它似乎一直保持着,並且還在2015年

工作完美無缺爲了得到它安裝和工作,我只能找到一些非常過時教程所以以爲我會分享我這樣做,爲我工作在Ubuntu 14.04安裝最新的穩定版(V1.1):

apt-get update 
apt-get install libpcre3-dev libmysqlclient-dev build-essential libmysqld-dev libpcre3-dev 
wget https://github.com/mysqludf/lib_mysqludf_preg/archive/lib_mysqludf_preg-1.1.tar.gz 
tar -xzf lib_mysqludf_preg-1.1.tar.gz 
cd lib_mysqludf_preg-1.1 
./configure 
make install 
make installdb 
service mysql restart 

你現在應該有所有可用的以下功能給你:

lib_mysqludf_preg_info 
preg_capture 
preg_check 
preg_replace 
preg_rlike 
preg_position 
+0

在https://github.com/mysqludf/lib_mysqludf_preg/blob/testing/INSTALL上的github INSTALL文檔中,還有一組相當不錯的安裝說明 – Slam 2015-12-29 06:46:43

0

從MySQL 5.5開始,你可以使用RLIKE

  • 無論是商店網址在REGEXP風格和查詢與

    SELECT * FROM URL地址以 '$網址' RLIKE網址;

  • 或保持在LIKE風格,並進行更換(由%* _通過。):

    SELECT * FROM URL地址以 '$網址' RLIKE REPLACE(REPLACE(URL,「 %','。*'),'_','。');

    爲了完整起見,你必須做其他替換以逃避正則表達式顯着的字符:? \()[] ...(見PHP函數preg_quote

相關問題