क्या कोई PHP फ़ंक्शन है जो लागू होने से पहले regex पैटर्न से बच सकता है?


161

क्या कोई PHP फ़ंक्शन है जो लागू होने से पहले regex पैटर्न से बच सकता है?

मैं C # Regex.Escape()फ़ंक्शन की तर्ज पर कुछ ढूंढ रहा हूं ।

जवाबों:


254

preg_quote() आप क्या देख रहे हैं:

विवरण

string preg_quote ( string $str [, string $delimiter = NULL ] )

preg_quote ()str हर वर्ण के सामने एक बैकस्लैश लेता है और रखता है जो नियमित अभिव्यक्ति सिंटैक्स का हिस्सा है। यह उपयोगी है यदि आपके पास एक रन-टाइम स्ट्रिंग है जिसे आपको कुछ पाठ में मिलान करने की आवश्यकता है और स्ट्रिंग में विशेष रेगेक्स वर्ण हो सकते हैं।

विशेष नियमित अभिव्यक्ति वर्ण हैं: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

पैरामीटर

str

इनपुट स्ट्रिंग।

सीमांकक

यदि वैकल्पिक सीमांकक निर्दिष्ट किया जाता है, तो यह भी बच जाएगा। यह PCRE फ़ंक्शंस द्वारा आवश्यक सीमांकक से बचने के लिए उपयोगी है। The / सबसे अधिक इस्तेमाल किया जाने वाला सीमांकक है।

महत्वपूर्ण रूप से, ध्यान दें कि यदि $delimiterतर्क निर्दिष्ट नहीं है, तो सीमांकक - चरित्र आपके रेगेक्स को घेरने के लिए उपयोग किया जाता है, आमतौर पर एक आगे स्लैश ( /) - बच नहीं जाएगा। आप आमतौर पर जो भी परिसीमन आप अपने regex के साथ उपयोग कर रहे हैं उसे $delimiterतर्क के रूप में पारित करना चाहेंगे ।

उदाहरण - preg_matchव्हॉट्सएप से घिरे किसी दिए गए URL की घटनाओं का पता लगाने के लिए उपयोग करना:

$url = 'http://stackoverflow.com/questions?sort=newest';

// preg_quote escapes the dot, question mark and equals sign in the URL (by
// default) as well as all the forward slashes (because we pass '/' as the
// $delimiter argument).
$escapedUrl = preg_quote($url, '/');

// We enclose our regex in '/' characters here - the same delimiter we passed
// to preg_quote
$regex = '/\s' . $escapedUrl . '\s/';
// $regex is now:  /\shttp\:\/\/stackoverflow\.com\/questions\?sort\=newest\s/

$haystack = "Bla bla http://stackoverflow.com/questions?sort=newest bla bla";
preg_match($regex, $haystack, $matches);

var_dump($matches);
// array(1) {
//   [0]=>
//   string(48) " http://stackoverflow.com/questions?sort=newest "
// }

11
@TomHaigh उत्तर के लिए एक अतिरिक्त टिप्पणी , यदि आप दूसरे $delimiterतर्क को निर्दिष्ट नहीं करते हैं तो preg_quote() यह किसी भी सीमांकक से बच नहीं पाएगा , यहां तक ​​कि "डिफ़ॉल्ट" (या सबसे आम) भी नहीं /
एलिक्स एक्सल

मैंने इस उत्तर के लिए सामान का एक पूरा गुच्छा जोड़ा है - $delimiterतर्क के महत्व के बारे में @AlixAxel द्वारा लाया गया नोट , डॉक्स से उस तर्क का वर्णन, वास्तव में इसके बारे में उलझन के लिए एक स्पष्टीकरण, और इसका भारी अर्थ उदाहरण के तौर पर टिप्पणी करते हुए दिखाया preg_quoteजा रहा है कि मैं सबसे सरल मामले में इस्तेमाल किया जा सकता हूं जहां यह वास्तव में प्रोग्राम के रूप में इस्तेमाल किया जा सकता है एक regex और इसे दूसरे preg_*फ़ंक्शन में डाल दिया (क्योंकि अन्यथा, क्या बात है?)। यदि आपको बदलाव पसंद नहीं है तो बेझिझक रोलबैक करें।
मार्क अमेरी सिप

1

टी-रेक्स लाइब्रेरी से तैयार पैटर्न का उपयोग करना अधिक सुरक्षित होगा :

$url = 'http://stackoverflow.com/questions?sort=newest';

$pattern = Pattern::prepare(['\s', [$url], '\s']);
                                // ↑ $url is quoted

फिर सामान्य टी-रेक्स मैच करें:

$haystack = "Bla bla http://stackoverflow.com/questions?sort=newest bla bla";

$matches = $pattern->match($haystack)->all();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.