PHP регуляр ида номланган карманлар
Фарз қилайлик, preg_match ёрдамида
sанани кун, ой ва йилга ажратишни истаймиз. Бунинг учун
карманлардан фойдаланамиз:
<?php
$str = '2025-10-29';
$reg = '#(\d{4})-(\d{2})-(\d{2})#';
preg_match($reg, $str, $match);
var_dump($match); // чиқади ['2025-10-29', '2025', '10', '29']
?>
Кўриб турганингиздек, натижада биз массив оламиз, унда ноль элементда бутун санa, биринчида - йил, иккинчида - ой, учинчида - кун бўлади.
Аммо баъзан, карманларнинг мундарижасини ассоциатив массив кўринишида олж qулай бўлар эди. Яъни бизнинг ҳолимизда шундай массив олса яхши бўлар эди:
[
'year' => '2025',
'month' => '10',
'day' => '29'
]
Бuning учун регуляр ифодаларда махсус
синтаксис мавжуд. Мана у: (?<name>pattern),
бу ерда pattern - регуляр ифода, name
эса карман номи.
Келинг, санa учун бизнинг регуляр ифодамизни номланган карманлар орқали қайта ёзайлик:
<?php
$str = '2025-10-29';
$reg = '#(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})#';
preg_match($reg, $str, $match);
var_dump($match);
?>
Натижада бизда ассоциатив массив ҳосил бўлади, унда калитлар sifatida карман номлари, қийматлар sifatida эса уларга тушган нарсалар бўлади:
[
'year' => '2025',
'month' => '10',
'day' => '29',
]
Аслида, натижа массивида карманларнинг қийматлари
номи bilan ҳам, тартиб рақами bilan ҳам олина олади. Яъни, масалан,
йил 'year' калити орқали
ва 1 рақами орқали, ой - 'month' калити орқали
ва 2 рақами орқали ва ҳоказо:
[
'year' => '2025',
'month' => '10',
'day' => '29',
1 => '2025',
2 => '10',
3 => '29'
]
Тасвирланган номланган карманларнинг яна бир неча
алтернатив синтаксислари мавжуд: (?P<name>pattern)
ва (?'name'pattern).
Вақт bilan сатр берилган:
<?php
$str = '12:59:59';
?>
Сўатлар, минутлар ва сонияларни алоҳида номланган карманларга қўйинг.
Натижа массивидаги барча рақамланган карманларни ўчириб, фақат номланганларни қолдирадиган функция ёзинг.