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