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

درآمدی بر مفاهیم 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 است زیرا گروه سوم که وظیفه داشت تا سال را در خود ذخیره سازد حذف شده است.

rocket
نظرات
اگر login نکردی برامون ایمیلت رو بنویس: