2009-11-10 8 views
10

मेरे पास MySQL में एक फ़ील्ड से मेल खाना है, जिसके लिए मैंने सोचा कि मैं नियमित अभिव्यक्ति का उपयोग कर सकता हूं, लेकिन ऐसा लगता है कि MySQL में ऐसी कार्यक्षमता नहीं है जो मुझे नौकरी करने की आवश्यकता है। यहां परिदृश्य है:क्या PHP का preg_replace का MySQL समतुल्य है?

मेरे पास PHP में एक चर है जिसे $ url कहा जाता है। मान लें कि यह चर स्ट्रिंग "/ आलेख/मेरा आलेख/पृष्ठ/2" के रूप में सेट है। मेरे पास MySQL में URL की एक तालिका भी है, जिससे मैं सामग्री खींचना चाहता हूं। हालांकि, मेरी तालिका में संग्रहीत यूआरएल वाइल्डकार्ड शामिल हैं।

पहले, मैंने यह सेट अप किया था ताकि तालिका में संग्रहीत मूल्य इस तरह दिखाई दे: "/ article /%/page /%"।

कि विन्यास के साथ

, मैं सिर्फ पड़ सकते है:

SELECT * FROM urls WHERE '$url' LIKE url 

और यह मेल खाएंगे, जो वांछित कार्यशीलता है।

अब मैं क्या करना चाहता हूं, एक और उन्नत वाइल्डकार्ड की अनुमति है, जैसे कि "/ article /%/page /%" के बजाय, मेरा MySQL डेटा "/ article/{{slug}}/पेज/{{page_no}} "।

मैं एक SQL क्वेरी बनाना चाहता हूं जो उसी डेटा यूआरएल इनपुट का उपयोग करके इस डेटा से मेल खाएगा। जैसे कि मैं सही तुलना नहीं कर रहा हूं, क्योंकि मैं अंतर्निहित "%" वाइल्डकार्ड का उपयोग नहीं कर रहा हूं, बल्कि {{। *}}। कोई विचार यह कैसे पूरा करने के लिए?

उत्तर

-1

मुझे एक समाधान मिला है। यह आदर्श नहीं है, लेकिन अगर मैं एक शुद्ध एसक्यूएल समाधान कभी सतह पर नहीं जाता तो मैं इसे यहां डाल दूंगा। मैं यूआरएलएलएल में "/ articles /%/पेज /%" के बराबर यूआरएलएल फ़ील्ड छोड़ सकता हूं और चर नामक एक और फ़ील्ड जोड़ सकता हूं जो उपयोग किए जाने वाले चर नामों की एक सूची संग्रहीत करता है। इस तरह से मैं अपनी मूल क्वेरी का उपयोग कर सकता हूं, फिर डेटा पुनर्प्राप्त करने के बाद स्प्रिंटफ के साथ PHP में "{{variable}}" के साथ वापसी मान में "%" वर्णों को प्रतिस्थापित कर सकता हूं।

फिर भी, मैं इसे संभवतः एसक्यूएल में हल करना चाहता हूं, क्योंकि मुझे लगता है कि अवधारणा मूल्यवान है।

4

यह क्या आप डेटाबेस जहां यूआरएल प्लेसहोल्डर आप के पास चला जाएगा है में नए वाक्य रचना है है क्या करना चाहते हैं की तरह लगता है आपका php- आधारित (sprintf) परिवर्तनीय प्रतिस्थापन कोड, लेकिन फिर भी यूआरएल से मेल खाने के लिए मूल तुलना करने में सक्षम हो।

अगर मैं सही ढंग से समझ आप एक नया URL प्रारूप

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

लेने के लिए और की तरह

/article/my-article/page/2 

preg प्लगइन Sagi उल्लेख प्रतिस्थापन की जरूरत है क्या कर सकते हैं, जो होगा कुछ के खिलाफ यह मैच के लिए चाहते हैं अपने नए स्वरूपित यूआरएल में से एक को मूल प्रारूप में बदल दें जिसका उपयोग आपने LIKE वाक्यविन्यास का उपयोग करके मैच निर्धारित करने के लिए किया था।निम्न क्वेरी:

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

नया यूआरएल बारी चाहेंगे (/ लेख/{{स्लग}}/पेज/{{page_no}}) क्या यह मूल रूप से

/article/%/page/% 

था में जो तब हो सकता है इस तरह आपकी मूल क्वेरी, कुछ के माध्यम से वापस तंग आ गया:

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

MAMP, XAMMP आदि जैसे कुछ द्विआधारी वितरण प्लगइन पहले से ही स्थापित है, लेकिन यह macports/Ubuntu सिस्टम की तरह का एक बहुत पर स्थापित नहीं है। प्रीग प्लगइन स्थापित करने के बारे में कुछ लेख यहां दिए गए हैं। आशा करता हूँ की ये काम करेगा।

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

3

उपयोगकर्ता Sagi ऊपर 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 इंस्टॉल दस्तावेज़ पर स्थापना निर्देशों का एक बहुत अच्छा सेट भी है – Slam

0

mysql 5.5 से शुरू है, तो आप उपयोग कर सकते हैं RLIKE:

  • साथ

    चुनें * URL से regexp शैली में दुकान यूआरएल, और क्वेरी या तो कहां '$ url' RLIKE यूआरएल;

  • या की तरह शैली में रखने के लिए, और एक प्रतिस्थापन बनाने (% से *, _ द्वारा।।):

    चुनें * URL से कहां '$ url' RLIKE REPLACE (REPLACE (यूआरएल, ' % ','। * '),' _ ','। ');

    पूरा होने के लिए, आपको regexp-important हैं जो वर्णों से बचने के लिए अन्य प्रतिस्थापन करना होगा:? \() [] ... (देखें php function preg_quote)