এমন কি কোনও পিএইচপি ফাংশন রয়েছে যা প্রয়োগ করার আগেই রেজেক্স প্যাটার্নগুলি এড়াতে পারে?


161

এমন কি কোনও পিএইচপি ফাংশন রয়েছে যা প্রয়োগ করার আগেই রেজেক্স প্যাটার্নগুলি এড়াতে পারে?

আমি সি # Regex.Escape()ফাংশনের লাইনে কিছু খুঁজছি for

উত্তর:


254

preg_quote() আপনি যা খুঁজছেন তা হ'ল:

বিবরণ

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

preg_quote ()str নিয়মিত এক্সপ্রেশন সিনট্যাক্সের অংশ এমন প্রতিটি চরিত্রের সামনে একটি ব্যাকস্ল্যাশ নেয় এবং রাখে। আপনার যদি রান-টাইম স্ট্রিং থাকে যা আপনার কিছু পাঠ্যে মিলতে হবে এবং স্ট্রিংয়ে বিশেষ রেজেেক্স অক্ষর থাকতে পারে This

বিশেষ নিয়মিত প্রকাশের অক্ষরগুলি হ'ল: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

পরামিতি

Str

ইনপুট স্ট্রিং।

বিভেদক

Alচ্ছিক ডিলিমিটার নির্দিষ্ট করা থাকলে এটি পালাতেও পারে। এটি পিসিআরই ফাংশনগুলির দ্বারা প্রয়োজনীয় ডিলিমিটারের পালানোর জন্য দরকারী। / সবচেয়ে সর্বাধিক ব্যবহৃত ডিলিমিটার।

গুরুত্বপূর্ণভাবে, দ্রষ্টব্য যে যদি $delimiterআর্গুমেন্টটি নির্দিষ্ট না করা থাকে তবে ডিলিমিটার - আপনার রেজেক্সকে ঘিরে রাখার জন্য ব্যবহৃত চরিত্রটি সাধারণত একটি ফরোয়ার্ড স্ল্যাশ ( /) - রক্ষা পাবেন না। আপনি সাধারণত আপনার রেজেক্সের সাথে যে কোনও ডিলিমিটার ব্যবহার করছেন তা $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আর্গুমেন্টের গুরুত্ব, ডক্স থেকে সেই যুক্তির বিবরণ, এর অর্থ ঠিক কী সম্পর্কে বিভ্রান্ত হয়েছে তার একটি ব্যাখ্যা এবং একটি ভারী সম্পর্কে preg_quoteসবচেয়ে সহজ ক্ষেত্রে ব্যবহার করা হচ্ছে এমন চিত্রিত উদাহরণটি আমি উপস্থিত করতে পেরেছিলাম যেখানে এটি প্রকৃতপক্ষে রিজেক্স গঠনের জন্য ব্যবহার করা হচ্ছে এবং এটি অন্য কোনও 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();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.