ডিলিমিটার অবশ্যই বর্ণানুক্রমিক বা ব্যাকস্ল্যাশ এবং প্রিগ_ম্যাচ হওয়া উচিত


88

আমার এই কোডটি রয়েছে:

$string1 = "My name is 'Kate' and im fine"; 
$pattern = "My name is '(.*)' and im fine"; 
preg_match($pattern , $string1, $matches);
echo $matches[1];

এবং যখন আমি এটি চালায় এটি এই ত্রুটিটি ফিরিয়ে দেয়:

সতর্কতা: প্রেগ_ম্যাচ () [ফাংশন.প্রেগ-ম্যাচ]: ডিলিমিটার অবশ্যই বর্ণমালা বা ব্যাকস্ল্যাশ হওয়া উচিত না


4
অন্যদের পক্ষে সহায়ক হতে পারে এমন একটি নোট হিসাবে, আপনি যদি আপনার সমস্ত যুক্তি preg_match()ভেরিয়েবল হিসাবে প্রেরণ করে থাকেন তবে নিশ্চিত হয়ে নিন যে আপনি ভেরিয়েবলের ক্রমটি ক্রিয়াকলাপের সাথে ক্রিয়াকলাপে মিশেছেন না কারণ এটি প্রায় অবশ্যই এর ফলস্বরূপ ঘটবে same ত্রুটি উপস্থিত।
ব্লুবাইনারি


4
ব্যবহার$pattern = "/My name is '(.*)' and im fine/";
জি.কে.

উত্তর:


134

আপনার প্যাটার্নের জন্য আপনার একটি ডিলিমিটার দরকার। এটি প্যাটার্নের শুরুতে এবং শেষে যুক্ত করা উচিত:

$pattern = "/My name is '(.*)' and im fine/";  // With / as a delimeter 

4
রেগেক্স এক্সপ্রেশনগুলিকে এনকাস করতে ডাবল কোট ব্যবহার করার বিষয়ে সতর্ক থাকুন, অন্যথায় কিছু character + অক্ষর সংমিশ্রণ (যেমন \lলাইন ফিডের জন্য) তাদের চরিত্রে রূপান্তরিত হবে, যা প্রত্যাশা ব্যতীত অন্য কোনও অভিব্যক্তি তৈরি করতে পারে। একক উদ্ধৃতি ব্যবহার করুন। দেখুন পিএইচপি স্ট্রিংস বিবরণ
পতঞ্জলি

এই উদাহরণে স্ট্রিংটিতে সিঙ্গেল কোটস অন্তর্ভুক্ত রয়েছে তাই এটি আবদ্ধ করার জন্য ডাবল কোট ব্যবহার করা আরও সহজ ( \'একক উদ্ধৃতিতে আবদ্ধ থাকলে পলায়ন এড়ানো প্রয়োজন হবে)।
পল

আমি একটি সাধারণ মন্তব্য করছিলাম, যেহেতু উদাহরণগুলি দেখছেন লোকেরা তাদের নিজের জন্য 'কুকি-কাট' হিসাবে গ্রহণ করতে পারে, অন্য পরিস্থিতিতে এগুলি প্রসারিত করা হলে ঘটে যাওয়া অপ্রত্যাশিত পরিণতি বুঝতে না পেরে। দুর্ভাগ্যক্রমে, আমি আমার মন্তব্যটিকে আরও নির্দিষ্ট করে তুলতে পারি না।
পতঞ্জলি

68

সমাধান (যা অন্যান্য উত্তরগুলি উল্লেখ করে না - কমপক্ষে আমার মূলত এটি লেখার সময়) হ'ল পিএইচপি যখন ডিলিটারগুলিকে বোঝায় তখন এটি আপনার কোডে যেসব বিভাজকগুলি দেখেন তাদের উল্লেখ করে না (যা উদ্ধৃতি চিহ্নগুলি হয়) তবে পরবর্তীটি স্ট্রিংয়ের ভিতরে অক্ষর। (বাস্তবে আমি কোনও ডকুমেন্টেশনে কোথাও এটি বর্ণিত কখনও দেখিনি: আপনাকে এটি উদাহরণগুলিতে দেখতে হবে।) সুতরাং নিয়মিত অভিব্যক্তি বাক্য বাক্য গঠনের পরিবর্তে আপনি অন্যান্য অনেক ভাষা থেকে অভ্যস্ত হতে পারেন:

/something/

পিএইচপি স্ট্রিং ব্যবহার করে এবং তারপরে অন্য ডিলিমিটারের জন্য স্ট্রিংয়ের ভিতরে দেখায় :

'/something/'

ডিলিমিটার পিএইচপি হ'ল /অক্ষরের জুটির পরিবর্তে 'অক্ষরের জুটি । সুতরাং আপনি যদি লিখেন 'something', পিএইচপি sঅভিযুক্ত ডিলিমিটার হিসাবে গ্রহণ করবে এবং অভিযোগ করবে যে আপনাকে আপনার ডিলিমিটার হিসাবে বর্ণমালা অক্ষর ব্যবহার করার অনুমতি নেই।

সুতরাং আপনি যদি iকেস (সংবেদনশীল) ম্যাচ চান তা দেখানোর জন্য কোনও উদাহরণ (উদাহরণস্বরূপ) পাস করতে চান, আপনি স্ট্রিংয়ের ভিতরে কিন্তু রেজেক্স ডেলিমিটারগুলির বাইরে এটি পাস করুন:

'/something/i'

আপনি যদি /আপনার ডিলিমিটার হিসাবে অন্য কিছু ব্যবহার করতে চান তবে আপনি এটি করতে পারেন, যেমন আপনি কোনও ইউআরএল মেলে এবং সমস্ত স্ল্যাশ থেকে বাঁচতে চান না:

'~something~'

4
@ গ্রুবার: ধন্যবাদ! আপনি সর্বদা এটিতে আপনার সমস্ত বন্ধুদের লিঙ্কগুলি প্রেরণ করতে পারেন এবং এটিকে উজ্জীবিত করতে দিন;)
আইকনোক্লাস্ট

4
কী ডকুমেন্টেশন ব্যাখ্যা করে না তা ব্যাখ্যা করে .. +1 আপনাকে ধন্যবাদ!
জুল অলিভিরা

সর্বাধিক উত্সাহিত উত্তরটি এর সমান, তবে, কেন এখন এটি সঠিক উত্তর তা বুঝতে পেরে আমি কৃতজ্ঞ । +1 ধন্যবাদ!
সারগ্রাহী

21

আপনার অভিব্যক্তির জন্য আপনাকে অবশ্যই একটি সীমানা নির্দিষ্ট করতে হবে। ডিলিমিটার হ'ল একটি বিশেষ চরিত্র যা আপনার অভিব্যক্তিটির শুরু এবং শেষের অংশে বোঝায় যে কোন অংশটি প্রকাশ। এটি আপনাকে কোনও অভিব্যক্তি এবং কোনটি সংশোধনকারী তা জানার জন্য মোডিফায়ার এবং দোভাষী ব্যবহার করতে দেয়। ত্রুটির বার্তাটি যেমন বলেছে, ডিলিমিটারটি ব্যাকস্ল্যাশ হতে পারে না কারণ ব্যাকস্ল্যাশ হ'ল পালাবার চরিত্র।

$pattern = "/My name is '(.*)' and im fine/";

এবং একই উদাহরণের নীচে তবে iসংবেদনশীল না হয়ে ম্যাচের পরিবর্তকের সাথে মেলে।

$pattern = "/My name is '(.*)' and im fine/i";

যেমন আপনি দেখতে পাচ্ছেন, এটি iস্ল্যাশগুলির বাইরে এবং সুতরাং এটি একটি সংশোধক হিসাবে ব্যাখ্যা করা হয়।

এও মনে রাখবেন যে আপনি যদি একটি ফরমান্ড স্ল্যাশ অক্ষর (/) একটি ডিলিমিটার হিসাবে ব্যবহার করেন তবে অবশ্যই উপস্থিত থাকলে নিয়মিত প্রকাশের / এর আরও ব্যবহারগুলি এড়াতে হবে।


7

প্যাটার্নটিতে অবশ্যই ডিলিমিটার থাকতে হবে। ডিলিমিটারগুলি ফরোয়ার্ড স্ল্যাশ (/) বা যে কোনও নন বর্ণমালা (#, $, *, ...) হতে পারে। উদাহরণ

$pattern = "/My name is '(.*)' and im fine/"; 
$pattern = "#My name is '(.*)' and im fine#";
$pattern = "@My name is '(.*)' and im fine@";  


0

মূল কোড উদাহরণের সাথে সম্পর্কিত নাও হতে পারে তবে আমি "ডিলিমিটার অবশ্যই বর্ণানুক্রমিক বা ব্যাকস্ল্যাশ হতে হবে না" এবং এখানে গুগলেড ত্রুটি পেয়েছি। কারণ: আমি পূর্ববর্তী_ম্যাচগুলির জন্য প্যারামিটারগুলির ক্রম মিশ্রিত করেছি। প্যাটার্নটি দ্বিতীয় প্যারামিটার ছিল এবং ম্যাচের জন্য স্ট্রিংটি প্রথম ছিল। সাবধান হও :)


-2

এটি দিয়ে চেষ্টা করুন

 $pattern = "/My name is '\(.*\)' and im fine/"; 

কেন বন্ধনী বন্ধন?
কি জাই

4
@kiJey ওপি'র পরিস্থিতিতে তারা নামটি বের করতে চেয়েছিল, তাই ম্যাচের জন্য প্রথম বন্ধনী আবশ্যক, সুতরাং অবশ্যই এড়াতে হবে না। এ কারণেই আমি এটিকে নিম্নমুখী করছি।
পতঞ্জলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.