PHPda muntazam ifodadagi qisqlar
Qisqlarning tarkibi nafaqat almashtirish satrida, balki muntazam ifodaning o'zida ham mavjud: biz biron bir narsani qisqqa joylashtirishimiz mumkin, so'ngra to'g'ridan-to'g'ri muntazam ifodada aytishimiz mumkinki, bu yerda shu qisqning tarkibi bo'lishi kerak.
Qisqlarning tarkibi ularning raqamlari bo'yicha
mavjud, oldida teskari chiziq bilan. Masalan,
nolchi qisq shunday mavjud bo'ladi: \0,
birinchi qisq shunday - \1, ikkinchi
- \2 va hokazo.
Men ishonamanki, yuqorida yozilganlarning hammasi siz uchun hali juda noaniq. Bu ajablanarli emas, chunki qisqlar - muntazam ifodalarning eng tushunarsiz joyi. Keling, misollar orqali tushunamiz.
Misol
Faraz qilaylik, bizda shunday satr bor:
<?php
$str = 'aa bb cd ef';
?>
Keling, unda ketma-ket kelayotgan ikkita bir xil harf joylashgan barcha joylarni topaylik. Masalani yechish uchun har qanday harfni qidirib, uni qisqqa joylashtiramiz, so'ngra keyingi belgi shu qisqning tarkibi ekanligini teksiramiz:
<?php
$res = preg_replace('#([a-z])\1#', '!', $str);
?>
Natijada o'zgaruvchiga quyidagi yoziladi:
'! ! cd ef'
Misol
Faraz qilaylik, bizda shunday satr bor:
<?php
$str = 'asxca buzxb csgd';
?>
Keling, unda birinchi va oxirgi harflari bir xil bo'lgan barcha so'zlarni topaylik. Masalani yechish uchun quyidagi andozani yozamiz: harf, keyin yana bir yoki undan ortiq harflar, va keyin birinchi harf bilan bir xil harf:
<?php
$res = preg_replace('#([a-z])[a-z]+\1#', '!', $str);
?>
Natijada o'zgaruvchiga quyidagi yoziladi:
'! ! csgd'
Misol
\1 o'rniga \g1 yozish mumkin:
<?php
$res = preg_replace('#([a-z])[a-z]+\g1#', '!', $str);
?>
Misol
Shuningdek, \g{1} yozish mumkin:
<?php
$res = preg_replace('#([a-z])[a-z]+\g{1}#', '!', $str);
?>
Misol
Jingaloq qavslar ichida manfiy sonlarni ko'rsatish mumkin. Bu holda qisqlar oxirdan hisoblana boshlanadi:
<?php
$res = preg_replace('#([a-z])([a-z])\g{-2}#', '!', $str);
?>
Amaliy vazifalar
Berilgan satr:
<?php
$str = 'aaa bbb ccc xyz';
?>
Ketma-ket uchta bir xil harf bo'lgan barcha pastki satrlarni toping.
Berilgan satr:
<?php
$str = 'a aa aaa abab bbbb';
?>
Ketma-ket ikkita yoki undan ortiq bir xil harf bo'lgan barcha pastki satrlarni toping.
Berilgan satr:
<?php
$str = 'aaa aaa bbb bbb ccc ddd';
?>
Ketma-ket ikkita bir xil so'z bo'lgan barcha pastki satrlarni toping.