درآمدی بر مفاهیم Group و Backreference در RegEx در زبان PHP


زمانی که با استفاده از علائم () اقدام به نوشتن الگویی در رِجِکس می‌کنیم، با این کار گروهی از دستورات را نوشته‌ایم که در آینده می‌توانیم با استفاده از علامت $ به آن‌ها ارجاع دهیم به طوری که اولین گروه با علامت 1$ و دومین گروه با علامت 2$ الی آخر قابل‌دسترسی خواهند بود. برای درک بهتر این موضوع، یک استرینگ حاوی تاریخی به صورت زیر می‌سازیم:

$string = '16-06-2020';

رِجِکسی که با چنین فرمتی مَچ شود نیز به صورت زیر خواهد بود:

$regex = "/([0-9]{1,2})-([0-9]{1,2})-([0-9]{4})/";

در تفسیر پَترن فوق می‌توان گفت که دستورات نوشته‌شده داخل علائم () تحت عنوان Group شناخته می‌شوند و نیاز به توضیح نیست که در رگیولار اکسپرشن فوق سه گروه داریم به طوری که با علامت - از یکدیگر جدا شده‌اند؛ گروه‌های اول و دوم حاکی از آنند که اعداد ۰ تا ۹ را می‌باید شامل شده و تعداد کاراکترهای آن‌ها می‌تواند ۱ یا ۲ باشد و گروه سوم نیز همانند دو گروه قبل است با این تفاوت که تعداد کاراکتر آن می‌باید ۴ عدد باشد.

حال فرض کنیم قصد داریم که فرمت 2020-06-16 را به صورت 2020-16-06 درآوریم که برای این منظور خواهیم داشت:

<?php
$string = '16-06-2020';
$regex = "/([0-9]{1,2})-([0-9]{1,2})-([0-9]{4})/";
$replace = "$2-$1-$3";
echo preg_replace($regex, $replace, $string);

خروجی اسکریپت فوق 2020-16-06 خواهد بود با این توضیح که در خط چهارم متغیری ساخته‌ایم تحت عنوان replace$ که در آن سه گروه فوق را هدف قرار داده‌ایم با این تفاوت که اول 2$ یا گروه دوم سپس گروه 1$ یا گروه اول و در نهایت 3$ یا گروه سوم را نوشته‌ایم؛‌ به طور خلاصه، جای گروه اول و دوم را با یکدیگر عوض نموده‌ایم. در ادامه،‌ با استفاده از فانکشن ()preg_replace به ترتیبی که ملاحظه می‌شود متغیرها را پاس داده‌ایم.

آشنایی با مفهوم Non-capturing Group

زمانی که در رِجِکس با گروه‌ها سروکار داریم،‌ علائم ترکیبی :? تحت عنوان Non-capturing Group شناخته می‌شوند که برای درک بهتر سازوکار این علائم، ابتدا آن‌ها را در اسکریپت زیر مورد استفاده قرار داده سپس به تفسیر خروجی خواهیم پرداخت:

<?php
$string = '16-06-2020';
$regex = "/([0-9]{1,2})-([0-9]{1,2})-(?:[0-9]{4})/";
$replace = "$2-$1-$3";
echo preg_replace($regex, $replace, $string);

خروجی کدهای فوق -16-06 است زیرا گروه سوم که وظیفه داشت تا سال را در خود ذخیره سازد حذف شده است.


لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
miadabdi80
miadabdi80
۱۳۹۸/۰۴/۰۳
backrefrence رو هم میشه در رجکس مچ نوشت! اگر توی همون رجکس مچ به یه گروپ رفرنس بزنیم، میتونیم مچ هایی بخش‌های یکسان رو به دست بیاریم. یه خورده توضیح دادنش سخته، مثال میزنم. 1\(d\)(d\) رو در نظر بگیرین، این پترن تنها دیتا هایی رو مچ میکنه که با یه عدد شروع شه ، یه عدد دیگه هم باشه و در نهایت کاراکتر سومی همون عدد اول باشه چون با 1\ به گروه اول اشاره می‌کنیم.
وقتی در این باکس نظر، انگلیسی تایپ میکنم ، کاراکتر ها به هم میریزن یا بر عکس میشن، درست کنین.