मैं PHP में preg अभिव्यक्ति को प्रीग में कैसे बदल सकता हूं?


140

चूंकि POSIX नियमित अभिव्यक्ति (ereg) PHP 5.3.0 के बाद से पदावनत है, इसलिए मैं पुराने भावों को PCRE (पर्ल कम्पेटिबल रेग्युलर एक्सप्रेशंस) (Preg) में बदलने का एक आसान तरीका जानना चाहता हूं ।

उदाहरण के अनुसार, मेरी यह नियमित अभिव्यक्ति है:

eregi('^hello world');

मैं अभिव्यक्तियों को preg_matchसंगत अभिव्यक्तियों में कैसे बदल सकता हूं ?

नोट: यह पोस्ट ereg से preg में रूपांतरण से संबंधित सभी पदों के लिए प्लेसहोल्डर के रूप में और संबंधित प्रश्नों के लिए एक डुप्लिकेट विकल्प के रूप में कार्य करता है। कृपया इस प्रश्न को बंद न करें।

सम्बंधित:


2
@ Yes123: हाँ, यह बात है, मैं भी इससे थक गया हूँ। मैं एक विकी पोस्ट चाहता हूं जो वास्तव में कुछ समझाए ताकि हम इन सभी व्यक्तिगत प्रश्नों को बंद कर सकें।
netcoder

मुझे लगता है कि इसके लिए कोई ज़रूरत नहीं है क्योंकि आपको पुराने को एक सीमांकक के साथ लपेटने की आवश्यकता है। इसके अलावा, मुझे लगता है कि आप इसके लिए पिछले उत्तर वाले प्रश्न का उपयोग कर सकते थे।
गतिशील

आह, टिप्पणियों को पढ़ने से पहले एक करीबी के लिए मतदान किया। एक प्लेसहोल्डर के रूप में यह एक उद्देश्य की पूर्ति कर सकता है, लेकिन क्या एक और पुराना सवाल नहीं है जो इस तरह से परोसा जा सकता है?
जुआन

हम्म, वास्तव में। ereg [php]बहुत उपयोगी परिणाम नहीं देता है। ठीक है, इस एक को मेरा समर्थन उधार दे सकता है।
जुआन

8
दोस्तों, हमें लगता है कि इस विषय पर सभी ने एक-दूसरे की ओर इशारा करते हुए बंद सवालों का एक घेरा बनाया है। इस दर पर वे सभी बंद हो जाएंगे :)
केव

जवाबों:


142

सिंटैक्स में सबसे बड़ा परिवर्तन सीमांकक के अतिरिक्त है ।

ereg('^hello', $str);
preg_match('/^hello/', $str);

Delimiters बहुत कुछ हो सकता है जो अल्फा-न्यूमेरिक नहीं है, बैकस्लैश या व्हॉट्सएप चरित्र है। सबसे अधिक इस्तेमाल किया जाता है ~, /और #

आप मिलान ब्रैकेट का उपयोग भी कर सकते हैं:

preg_match('[^hello]', $str);
preg_match('(^hello)', $str);
preg_match('{^hello}', $str);
// etc

यदि आपका परिसीमन नियमित अभिव्यक्ति में पाया जाता है, तो आपको इससे बचना होगा:

ereg('^/hello', $str);
preg_match('/^\/hello/', $str);

आप preg_quote का उपयोग करके आसानी से एक स्ट्रिंग में सभी सीमांकक और आरक्षित वर्णों से बच सकते हैं :

$expr = preg_quote('/hello', '/');
preg_match('/^'.$expr.'/', $str);

इसके अलावा, पीसीआरई विभिन्न चीजों के लिए संशोधक का समर्थन करता है । सबसे अधिक इस्तेमाल में से एक केस-असंवेदनशील संशोधक है i, eregi का विकल्प :

eregi('^hello', 'HELLO');
preg_match('/^hello/i', 'HELLO');

आप मैनुअल में PHP में PCRE सिंटैक्स का पूरा संदर्भ पा सकते हैं , साथ ही अभिव्यक्ति को परिवर्तित करने में मदद करने के लिए POSIX regex और PCRE के बीच मतभेदों की एक सूची

हालाँकि, आपके सरल उदाहरण में आप एक नियमित अभिव्यक्ति का उपयोग नहीं करेंगे:

stripos($str, 'hello world') === 0

2
अद्भुत व्याख्या! मैं सिर्फ एक विशेष मामला जोड़ना चाहता हूं जिसमें आपके ereg से preg_match में परिवर्तित हो रहे हैं और आपको केवल सीमांकक से बचने की आवश्यकता है और आरक्षित वर्ण नहीं हैं (क्योंकि वे पहले से ही विशेष वर्ण के रूप में काम कर रहे थे, हम उनसे बचना नहीं चाहते हैं) : preg_match ('/'। str_replace ('/', '\ /', $ expr)। '/', $ str);
लोलिटो

यह विशेष रूप से ध्यान देने योग्य है कि यदि आप मिलान ब्रैकेट का उपयोग करते हैं, तो आपको किसी भी वर्ण से बचने की आवश्यकता नहीं है "क्योंकि यह सीमांकक के समान है" जैसे आप अन्य प्रतीकों के साथ करते हैं जैसे कि /^\/hello/उदाहरण। (a(b)c)एक पूरी तरह से मान्य, सीमांकित PCRE है। मैं व्यक्तिगत रूप से ()खुद को याद दिलाने के लिए कोष्ठक का उपयोग करना पसंद करता हूं कि पहला कब्जा किया गया मैच पूरी चीज है।
नीट द डार्क एबसोल

क्या मैं कह सकता हूँ, मुझे नफरत करने वाले PHP की आशंका है! (बस इतना ही। कुछ और नहीं।) मुझे इन उत्तरों को खोजना होगा जब मेरा साझा वेब होस्टिंग सर्वर एक नए संस्करण में अपडेट हो जाता है और error_logइन चेतावनियों के साथ पूर्ण हो जाता है PHP Deprecated: Function ereg() is deprecated in...:। अरे!
c00000fd

इसे कैसे रूपांतरित करें? $ रेगेक्स = $ ई। '(\ _। [^ \ _।'। $ e। '] [^'। $ e। '] * *] = \ _ \ _। [^' $ e। '] +) | ([^ \ _ ] [^ '। $ e।'] *)) '। $ ई। '\। \।' । ई $;
प्रीग_मथ

32

प्रीग के साथ ईईजी प्रतिस्थापन (PHP 5.3.0 के रूप में) हमारे पक्ष में सही कदम था।

preg_match, जो पर्ल-संगत नियमित अभिव्यक्ति सिंटैक्स का उपयोग करता है, अक्सर ereg का एक तेज़ विकल्प होता है।

आपको gg पैटर्न को preg करने के लिए 4 मुख्य बातें पता होनी चाहिए:

  1. सीमांकक जोड़ें (/):'pattern' => '/pattern/'

  2. अगर यह पैटर्न का एक हिस्सा है तो सीमांकक से बच : 'patt/ern' => '/patt\/ern/'
    इसे निम्नलिखित तरीके से प्रोग्रामेटिक रूप से प्राप्त करें:
    $old_pattern = '<div>.+</div>';
    $new_pattern = '/' . addcslashes($old_pattern, '/') . '/';

  3. eregi (केस-इनसेन्सिटिव मैचिंग): 'pattern' => '/pattern/i' तो, यदि आप केस इंसेंटिव मिलान के लिए eregi फ़ंक्शन का उपयोग कर रहे हैं, तो बस नए पैटर्न ('/ पैटर्न /') के अंत में 'i' जोड़ें।

  4. ASCII मान : ereg में, यदि आप पैटर्न में संख्या का उपयोग करते हैं, तो यह माना जाता है कि आप किसी वर्ण के ASCII का उल्लेख कर रहे हैं। लेकिन प्राग में, संख्या को ASCII मान के रूप में नहीं माना जाता है। इसलिए, यदि आपके पैटर्न में ereg अभिव्यक्ति में ASCII मान है (उदाहरण के लिए: नई लाइन, टैब आदि) तो इसे हेक्साडेसिमल में बदलें और इसे \ x के साथ उपसर्ग करें।
    Example: 9(tab) becomes \x9 or alternatively use \t.


8

PHP संस्करण 5.3 से, eregपदावनत किया जाता है।

से चलती eregकरने के लिए preg_matchहमारे पैटर्न में एक छोटा सा परिवर्तन है।

सबसे पहले, आपको अपने कोड में सीमांकक जोड़ना होगा, जैसे:

ereg('A-Z0-9a-z', 'string');

सेवा

preg_match('/A-Z0-9a-z/', 'string');

के लिए eregiकेस-संवेदी मिलान, डाल iपिछले सीमांकक, जैसे के बाद:

eregi('pattern', 'string');

सेवा

preg_match ('/pattern/i', 'string');

7

सिंटैक्स के बीच ereg()और अधिक अंतर हैं preg_replace():

  • प्रतिलाभ की मात्रा:

    • त्रुटि पर : दोनों वापसFALSE
    • बिना किसी मिलान के : ereg()रिटर्न FALSE, preg_match()रिटर्न0
    • मैच पर : ereg()स्ट्रिंग की लंबाई या 1, preg_match()हमेशा रिटर्न देता है1
  • मिलान किए गए सबस्ट्रिंग के परिणामी सरणी: यदि कुछ सबस्ट्रिंग सब में ( (b)इन ...a(b)?) नहीं मिला है , तो ereg()परिणाम में संबंधित आइटम होगा FALSE, जबकि preg_match()इसमें बिल्कुल भी सेट नहीं किया जाएगा।

यदि कोई अपने को परिवर्तित करने के लिए पर्याप्त बहादुर नहीं ereg()है preg_match(), तो वह mb_ereg () का उपयोग कर सकता है , जो अभी भी PHP 7 में उपलब्ध है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.