زمانی که با استفاده از علائم () اقدام به نوشتن الگویی در رِجِکس میکنیم، با این کار گروهی از دستورات را نوشتهایم که در آینده میتوانیم با استفاده از علامت $ به آنها ارجاع دهیم به طوری که اولین گروه با علامت 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 است زیرا گروه سوم که وظیفه داشت تا سال را در خود ذخیره سازد حذف شده است.
