কীভাবে আমি পিএইচপি এগ্রে এক্সপ্রেশনগুলিকে প্রিগে রূপান্তর করতে পারি?


140

যেহেতু POSIX নিয়মিত এক্সপ্রেশন (ইরেগ) পিএইচপি 5.3.0 থেকে অবহেলিত হয়েছে, তাই আমি পুরানো এক্সপ্রেশনগুলি পিসিআরই (পার্ল সামঞ্জস্যপূর্ণ নিয়মিত এক্সপ্রেশন) (প্রাক) রূপান্তর করার একটি সহজ উপায় জানতে চাই ।

উদাহরণস্বরূপ, আমার এই নিয়মিত প্রকাশ আছে:

eregi('^hello world');

আমি কীভাবে এক্সপ্রেশনগুলি preg_matchসামঞ্জস্যপূর্ণ এক্সপ্রেশনগুলিতে অনুবাদ করতে পারি ?

দ্রষ্টব্য: এই পোস্টটি Ereg থেকে পূর্বের দিকে রূপান্তর সম্পর্কিত সমস্ত পোস্টের জন্য স্থানধারক এবং সম্পর্কিত প্রশ্নের জন্য সদৃশ বিকল্প হিসাবে কাজ করে। এই প্রশ্নটি বন্ধ করবেন না দয়া করে।

সম্পর্কিত:


2
@ হ্যাঁ 123: হ্যাঁ, এটিই মূল বিষয়, আমিও এতে ক্লান্ত হয়ে পড়েছি। আমি একটি উইকি পোস্ট চাই যা আসলে কিছু ব্যাখ্যা করে যাতে আমরা এই সমস্ত স্বতন্ত্র প্রশ্নগুলি বন্ধ করতে পারি।
নেটকোডার

আমি মনে করি এটির কোনও প্রয়োজন নেই কারণ আপনার কেবল পুরানোটি একটি ডিলিমিটার দিয়ে মোড়ানো দরকার। এছাড়াও আমি মনে করি আপনি এটির জন্য পূর্ববর্তী উত্তরটি ব্যবহার করতে পারতেন।
গতিশীল

আহ, মন্তব্যগুলি পড়ার আগে কাছের পক্ষে ভোট দিয়েছেন। স্থানধারক হিসাবে এটি কোনও উদ্দেশ্যটি পরিবেশন করতে পারে, তবে এর পরে আর কোনও পুরানো প্রশ্ন নেই যা এটি পরিবেশন করতে পারে?
রিক্কেন

হুঁ, সত্যিই। ereg [php]খুব দরকারী ফল দেয় না। ঠিক আছে, এই আমার সমর্থন ধার দিতে পারেন।
রিক্কেন

8
ভাবেন, আমরা মনে করি আমরা একে অপরের দিকে ইঙ্গিত করে এই বিষয়ে বন্ধ প্রশ্নগুলির একটি চক্র প্রায় তৈরি করেছি। এই হারে তারা সমস্ত বন্ধ থাকবে :)
কেভ

উত্তর:


142

সিনট্যাক্সের বৃহত্তম পরিবর্তনটি হ'ল সীমানা যুক্তকারী

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

ডিলিমিটারগুলি আলফা-সংখ্যাসূচক, ব্যাকস্ল্যাশ বা একটি সাদা স্থান নয় এমন কিছু হতে পারে। সর্বাধিক ব্যবহৃত হয় সাধারণত ~, /এবং #

আপনি ম্যাচিং বন্ধনী ব্যবহার করতে পারেন:

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);

এছাড়াও, PCRE সমর্থন সংশোধনকারীদের বিভিন্ন জিনিসের জন্য। সর্বাধিক ব্যবহৃত এক হ'ল কেস-সংবেদনশীল সংশোধক i, ইরেগির বিকল্প :

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

আপনি ম্যানুয়ালে পিএইচপি তে পিসিআরআই সিনট্যাক্সের সম্পূর্ণ রেফারেন্সটি খুঁজে পেতে পারেন , পাশাপাশি অভিব্যক্তিকে রূপান্তর করতে সহায়তা করার জন্য পসিক্স রেজেক্স এবং পিসিআরই মধ্যে পার্থক্যের একটি তালিকা পেতে পারেন।

তবে আপনার সাধারণ উদাহরণে আপনি নিয়মিত প্রকাশটি ব্যবহার করবেন না:

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

2
অপূর্ব ব্যাখ্যা! আমি কেবল একটি বিশেষ কেস যুক্ত করতে চাই যাতে আপনার Ereg থেকে preg_match এ রূপান্তর হয় এবং আপনার কেবলমাত্র সীমানা ছাড়ানো দরকার এবং সংরক্ষিত অক্ষর নয় (কারণ তারা ইতিমধ্যে বিশেষ চরিত্র হিসাবে কাজ করছিল, আমরা এগুলি থেকে পালাতে চাই না) : প্রিগ_ম্যাচ ('/'। str_replace ('/', '\ /', $ এক্সপ্রেস)। '/', $ স্ট্র));
ললিতো

এটি বিশেষভাবে লক্ষণীয় যে আপনি যদি ম্যাচিং বন্ধনী ব্যবহার করেন, তবে উদাহরণস্বরূপ অন্যান্য চিহ্নগুলির সাথে আপনার যেমন "ডিলিমিটারের সমান" তেমন কোনও অক্ষর এড়ানো প্রয়োজন হবে না/^\/hello/(a(b)c)একটি পুরোপুরি বৈধ, সীমিত পিসিআরই। আমি ব্যক্তিগতভাবে ()আমার প্রথম স্মরণ করিয়ে দেওয়া ম্যাচ পুরো জিনিসটি মনে করিয়ে দেওয়ার জন্য প্রথম বন্ধনী ব্যবহার করতে চাই।
নাইট দ্য ডার্ক অ্যাবসোল

আমি কি বলতে পারি, আমি পিএইচপিকে ঘৃণা করি ! (ঠিক এটি। অন্য কিছু নয়।) যখন আমার ভাগ করা ওয়েব হোস্টিং সার্ভারটি নতুন সংস্করণে আপডেট হয়ে যায় এবং error_logএস এই সতর্কতাগুলি পূর্ণ করে: তখন আমাকে এই উত্তরগুলি সন্ধান করতে হবে PHP Deprecated: Function ereg() is deprecated in...। আহা!
c00000fd

এই রূপান্তর কিভাবে? ge regex = $ e। '((\। [^ \।'। $ ই। '] [^'। $ ই। '] *)) ((\। \। [^'। $ ই। '] +) |) ((^ \। ] [^ '। $ ই।'] *)) '। $ ই। '\। \'। । ই $;
Preg_math এটি doest

32

প্রাগ (পিএইচপি 5.3.0 হিসাবে) এর সাথে এরেগ প্রতিস্থাপনটি আমাদের পক্ষে সঠিক পদক্ষেপ ছিল।

প্রেগ_ম্যাচ, যা পার্ল-সামঞ্জস্যপূর্ণ নিয়মিত এক্সপ্রেশন সিনট্যাক্স ব্যবহার করে, প্রায়শই ইরেগের জন্য দ্রুত বিকল্প হয়।

প্রিগে Ereg প্যাটার্নগুলি পোর্ট করার জন্য আপনার 4 টি প্রধান জিনিস জানা উচিত:

  1. সীমানা যুক্ত করুন (/):'pattern' => '/pattern/'

  2. সীমানারটির অংশ হলে ডিলিমিটারটি এড়িয়ে চলুন : 'patt/ern' => '/patt\/ern/'
    প্রোগ্রামের মাধ্যমে এটি নিম্নলিখিত উপায়ে অর্জন করুন:
    $old_pattern = '<div>.+</div>';
    $new_pattern = '/' . addcslashes($old_pattern, '/') . '/';

  3. ইরেগি (কেস-সংবেদনশীল মিল): 'pattern' => '/pattern/i' সুতরাং, যদি আপনি কেস সংবেদনশীল মিলের জন্য ইরেগি ফাংশনটি ব্যবহার করেন তবে নতুন প্যাটার্নের শেষে 'i' যুক্ত করুন ('/ প্যাটার্ন /')।

  4. এএসসিআইআই মান : ইরেগে, আপনি যদি প্যাটার্নে নম্বরটি ব্যবহার করেন তবে ধরে নেওয়া হয় যে আপনি কোনও চরিত্রের ASCII উল্লেখ করছেন। তবে প্রাক হিসাবে, সংখ্যাটিকে ASCII মান হিসাবে বিবেচনা করা হয় না। সুতরাং, যদি আপনার প্যাটার্নটিতে Ereg এক্সপ্রেশনটিতে ASCII মান থাকে (উদাহরণস্বরূপ: নতুন লাইন, ট্যাব ইত্যাদি) তবে এটিকে হেক্সাডেসিমালে রূপান্তর করুন এবং এটি \ x দিয়ে উপসর্গ করুন।
    Example: 9(tab) becomes \x9 or alternatively use \t.


8

পিএইচপি সংস্করণ 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 () যা এখনও পিএইচপি 7 উপলব্ধ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.