4-bo‘lim
Satrlar bilan ishlash
Qo'shtirnoq va apostrof farqi, qidirish va almashtirish, bo'lish va birlashtirish, UTF-8 va mb_ funksiyalari.
Ushbu bo‘lim mundarijasi
Veb dasturlashda ishingizning katta qismi - matn. Forma ma'lumoti, URL, HTML, JSON - hammasi satr.
Qo'shtirnoq va apostrof #
// Har bir misol qat'iy turlar rejimida ishlaydi.
$ism = "Husanboy";
$yosh = 25;
// Qo'shtirnoq - o'zgaruvchilarni O'RNIGA QO'YADI
echo "Qo'shtirnoq: {$ism}, {$yosh} yosh\n";
// Apostrof - matnni AYNAN chiqaradi
echo 'Apostrof: {$ism}, {$yosh} yosh' . "\n";
echo "\n";
// Maxsus belgilar faqat qo'shtirnoqda ishlaydi
echo "Qo'shtirnoqda \\t tabulyatsiya:\tmana\n";
echo 'Apostrofda \t tabulyatsiya:\tmana' . "\n";
echo "\n";
// Murakkab ifodalar uchun figurali qavs SHART
$mahsulot = ["nom" => "Klaviatura", "narx" => 350000];
echo "Massiv elementi: {$mahsulot['nom']}\n";
echo "Narxi: {$mahsulot['narx']} so'm\n";
Qo'shtirnoq: Husanboy, 25 yosh
Apostrof: {$ism}, {$yosh} yosh
Qo'shtirnoqda \t tabulyatsiya: mana
Apostrofda \t tabulyatsiya:\tmana
Massiv elementi: Klaviatura
Narxi: 350000 so'm
| Vaziyat | Tanlov |
|---|---|
| O'zgaruvchi qo'yish kerak | "qo'shtirnoq" |
\n, \t kerak | "qo'shtirnoq" |
| Oddiy matn | 'apostrof' |
Matnda $ bor (masalan narx belgisi) | 'apostrof' |
| HTML atributlari ichida | 'apostrof' qulayroq |
Tezlik farqi amalda sezilmaydi - PHP 7 dan beri ikkalasi deyarli bir xil tez. Shuning uchun tanlovni tezlik emas, o'qish qulayligi bilan qiling.
Figurali qavs qoidasi:
echo "$ism"; // ishlaydi
echo "{$ism}"; // ishlaydi, aniqroq
echo "$massiv['kalit']"; // XATO
echo "{$massiv['kalit']}";// to'g'ri
echo "{$obyekt->usul()}"; // faqat shunday ishlaydi
Tavsiya: har doim {} qo'ying. U hech qachon zarar
qilmaydi va qayerda o'zgaruvchi tugashini aniq ko'rsatadi.
Heredoc va Nowdoc #
$mijoz = "Malika";
$summa = 450000;
// Heredoc - qo'shtirnoq kabi ishlaydi (o'zgaruvchi qo'yiladi)
$xat = <<<MATN
Hurmatli {$mijoz},
Sizning buyurtmangiz qabul qilindi.
To'lov summasi: {$summa} so'm.
Hurmat bilan,
Softromeda
MATN;
echo $xat . "\n";
echo "\n" . str_repeat("=", 40) . "\n\n";
// Nowdoc - apostrof kabi (o'zgaruvchi qo'yilmaydi)
$shablon = <<<'SHABLON'
Hurmatli {$mijoz},
Summa: {$summa}
SHABLON;
echo $shablon . "\n";
Hurmatli Malika,
Sizning buyurtmangiz qabul qilindi.
To'lov summasi: 450000 so'm.
Hurmat bilan,
Softromeda
========================================
Hurmatli {$mijoz},
Summa: {$summa}
Yuqoridagi kodda MATN; qatori kod bilan bir xil
darajada chekintirilgan - va PHP shu chekinishni
avtomatik olib tashlaydi.
Eski PHP da yopuvchi belgi majburiy ravishda qator boshida turishi kerak edi:
$xat = <<<MATN
Matn shu yerda boshlanadi
MATN;
Bu kodni juda xunuk qilardi. Endi esa heredoc blokini funksiya ichida ham chiroyli yozish mumkin.
Qoida: yopuvchi belgidagi chekinish har bir qatordan olib tashlanadi. Agar biror qator undan kamroq chekintirilgan bo'lsa - xato beradi.
Heredoc qayerda qulay: SQL so'rovlari, elektron xat shablonlari, uzun HTML bo'laklari.
Asosiy funksiyalar #
$matn = " Zamonaviy PHP dasturlash ";
printf("%-28s %s\n", "Asl (qavs ichida):", "[{$matn}]");
printf("%-28s %s\n", "trim:", "[" . trim($matn) . "]");
printf("%-28s %s\n", "ltrim:", "[" . ltrim($matn) . "]");
printf("%-28s %s\n", "rtrim:", "[" . rtrim($matn) . "]");
$t = trim($matn);
echo "\n";
printf("%-28s %d\n", "strlen (bayt):", strlen($t));
printf("%-28s %s\n", "strtoupper:", strtoupper($t));
printf("%-28s %s\n", "strtolower:", strtolower($t));
printf("%-28s %s\n", "ucfirst:", ucfirst(strtolower($t)));
printf("%-28s %s\n", "ucwords:", ucwords(strtolower($t)));
echo "\n";
printf("%-28s %s\n", "str_contains 'PHP':", str_contains($t, "PHP") ? "ha" : "yo'q");
printf("%-28s %s\n", "str_starts_with 'Zamon':", str_starts_with($t, "Zamon") ? "ha" : "yo'q");
printf("%-28s %s\n", "str_ends_with 'lash':", str_ends_with($t, "lash") ? "ha" : "yo'q");
printf("%-28s %d\n", "strpos 'PHP':", strpos($t, "PHP"));
printf("%-28s %s\n", "substr(0, 9):", substr($t, 0, 9));
printf("%-28s %s\n", "str_replace:", str_replace("PHP", "PHP 8", $t));
Asl (qavs ichida): [ Zamonaviy PHP dasturlash ]
trim: [Zamonaviy PHP dasturlash]
ltrim: [Zamonaviy PHP dasturlash ]
rtrim: [ Zamonaviy PHP dasturlash]
strlen (bayt): 24
strtoupper: ZAMONAVIY PHP DASTURLASH
strtolower: zamonaviy php dasturlash
ucfirst: Zamonaviy php dasturlash
ucwords: Zamonaviy Php Dasturlash
str_contains 'PHP': ha
str_starts_with 'Zamon': ha
str_ends_with 'lash': ha
strpos 'PHP': 10
substr(0, 9): Zamonaviy
str_replace: Zamonaviy PHP 8 dasturlash
strpos natijasini !== false bilan tekshiringstrpos satr topilmasa false, birinchi belgida
topilsa 0 qaytaradi. Va 0 PHP da bo'sh hisoblanadi:
if (strpos($matn, "Zamon")) { // XATO
// "Zamon" 0-o'rinda - shart YOLG'ON bo'ladi
}
if (strpos($matn, "Zamon") !== false) { // to'g'ri
// ishlaydi
}
Bu PHP dagi eng mashhur tuzoqlardan biri. U yillar davomida minglab xatoga sabab bo'lgan.
PHP 8 buni hal qildi. Endi shunchaki yozing:
| Eski usul | Yangi (PHP 8) |
|---|---|
strpos($a, $b) !== false | str_contains($a, $b) |
substr($a, 0, strlen($b)) === $b | str_starts_with($a, $b) |
substr($a, -strlen($b)) === $b | str_ends_with($a, $b) |
O'ng ustundagilar aniq bool qaytaradi va hech qanday
tuzoq yo'q. strpos ni faqat o'rnini bilish kerak
bo'lganda ishlating.
UTF-8 va o'zbek harflari #
$uz = "O'zbekiston";
$rus = "Привет";
echo "strlen('{$uz}') = " . strlen($uz) . " bayt\n";
echo "mb_strlen('{$uz}') = " . mb_strlen($uz) . " belgi\n";
echo "\n";
echo "strlen('{$rus}') = " . strlen($rus) . " bayt\n";
echo "mb_strlen('{$rus}') = " . mb_strlen($rus) . " belgi\n";
echo "\n";
echo "Kirill harflar ikki baytdan iborat - shuning uchun farq bor.\n";
echo "\n";
echo "Noto'g'ri kesish (substr): " . substr($rus, 0, 5) . "|\n";
echo "To'g'ri kesish (mb_substr): " . mb_substr($rus, 0, 5) . "|\n";
echo "\n";
echo "strtoupper (kirill uchun ishlamaydi): " . strtoupper($rus) . "\n";
echo "mb_strtoupper (to'g'ri): " . mb_strtoupper($rus) . "\n";
strlen('O'zbekiston') = 11 bayt
mb_strlen('O'zbekiston') = 11 belgi
strlen('Привет') = 12 bayt
mb_strlen('Привет') = 6 belgi
Kirill harflar ikki baytdan iborat - shuning uchun farq bor.
Noto'g'ri kesish (substr): Пр�|
To'g'ri kesish (mb_substr): Приве|
strtoupper (kirill uchun ishlamaydi): Привет
mb_strtoupper (to'g'ri): ПРИВЕТ
mb_ ishlatingPHP ning oddiy satr funksiyalari baytlar bilan ishlaydi, belgilar bilan emas.
Lotin harflari uchun bu farq yo'q - ular bir baytdan iborat. Lekin kirill, arab, xitoy yoki emoji uchun bitta belgi 2-4 bayt egallaydi.
Natijada substr belgini o'rtasidan kesib yuborishi
mumkin - va ekranda buzuq belgi chiqadi.
| Oddiy | Ko'p baytli |
|---|---|
strlen | mb_strlen |
substr | mb_substr |
strtoupper | mb_strtoupper |
strtolower | mb_strtolower |
strpos | mb_strpos |
str_split | mb_str_split |
Qachon qaysi biri:
| Vazifa | Funksiya |
|---|---|
| Fayl hajmini hisoblash | strlen (bayt kerak) |
| Matnni qisqartirish | mb_substr |
| Belgilar sonini sanash | mb_strlen |
| Parol uzunligini tekshirish | mb_strlen |
mb_ funksiyalari mbstring kengaytmasini talab
qiladi - 2-bo'limda uni tekshirgan edik.
Bo'lish va birlashtirish #
$qator = "klaviatura,sichqoncha,monitor,quloqchin";
$royxat = explode(",", $qator);
echo "Elementlar soni: " . count($royxat) . "\n";
foreach ($royxat as $i => $element) {
echo " [{$i}] {$element}\n";
}
echo "\n";
echo "Qayta birlashtirish: " . implode(" | ", $royxat) . "\n";
echo "\n";
// Cheklangan bo'lish
$sana = "2024-09-01";
[$yil, $oy, $kun] = explode("-", $sana);
echo "Yil: {$yil}, Oy: {$oy}, Kun: {$kun}\n";
echo "\n";
// Bo'sh elementlarni tozalash
$tartibsiz = "olma, , anor, ,behi";
$toza = array_values(array_filter(
array_map("trim", explode(",", $tartibsiz)),
static fn(string $x): bool => $x !== ""
));
echo "Tozalangan: " . implode(", ", $toza) . "\n";
echo "Soni: " . count($toza) . "\n";
Elementlar soni: 4
[0] klaviatura
[1] sichqoncha
[2] monitor
[3] quloqchin
Qayta birlashtirish: klaviatura | sichqoncha | monitor | quloqchin
Yil: 2024, Oy: 09, Kun: 01
Tozalangan: olma, anor, behi
Soni: 3
Formatlash #
$narx = 1234567.891;
echo "number_format:\n";
echo " standart: " . number_format($narx) . "\n";
echo " 2 xona: " . number_format($narx, 2) . "\n";
echo " o'zbekcha: " . number_format($narx, 2, ",", " ") . " so'm\n";
echo "\n";
echo "printf/sprintf:\n";
printf(" %%d butun: %d\n", $narx);
printf(" %%.2f kasr: %.2f\n", $narx);
printf(" %%10.2f o'ngga: %10.2f\n", 42.5);
printf(" %%-10s chapga: [%-10s]\n", "matn");
printf(" %%05d nol bilan: %05d\n", 42);
printf(" %%x o'n oltilik: %x\n", 255);
printf(" %%b ikkilik: %b\n", 10);
echo "\n";
$satr = sprintf("Buyurtma #%04d - %s", 7, "tayyor");
echo "sprintf natijasi: {$satr}\n";
echo "\n";
echo "str_pad bilan jadval:\n";
$qatorlar = [["Non", 4000], ["Sut", 12500], ["Shakar", 9800]];
foreach ($qatorlar as [$nom, $narxi]) {
echo " " . str_pad($nom, 12, ".") . str_pad((string) $narxi, 8, " ", STR_PAD_LEFT) . "\n";
}
number_format:
standart: 1,234,568
2 xona: 1,234,567.89
o'zbekcha: 1 234 567,89 so'm
printf/sprintf:
%d butun: 1234567
%.2f kasr: 1234567.89
%10.2f o'ngga: 42.50
%-10s chapga: [matn ]
%05d nol bilan: 00042
%x o'n oltilik: ff
%b ikkilik: 1010
sprintf natijasi: Buyurtma #0007 - tayyor
str_pad bilan jadval:
Non......... 4000
Sut......... 12500
Shakar...... 9800
printf va sprintf farqi| Funksiya | Nima qiladi |
|---|---|
printf | Ekranga chiqaradi |
sprintf | Satr sifatida qaytaradi |
vsprintf | Argumentlarni massivdan oladi |
Eng ko'p ishlatiladigan belgilar:
| Belgi | Ma'nosi |
|---|---|
%d | Butun son |
%s | Satr |
%f | Kasr son |
%.2f | Ikki xonali kasr |
%05d | Nol bilan to'ldirilgan |
%-10s | Chapga tekislangan |
%% | Foiz belgisining o'zi |
Diqqat: printf foydalanuvchi kiritgan matnni format
satri sifatida ishlatmang:
printf($foydalanuvchi_matni); // XAVFLI
printf("%s", $foydalanuvchi_matni); // to'g'ri
Birinchi holatda matndagi %s belgilari format
ko'rsatkichi deb qabul qilinadi va kutilmagan natija
beradi.
Amaliy misol: slug yasash #
function slugYasa(string $matn): string
{
$matn = mb_strtolower($matn, "UTF-8");
// 1-qadam: APOSTROFLARNI butunlay olib tashlaymiz.
// Ularni tire qilib qoldirsak, "ta'lim" -> "ta-lim" bo'lardi.
// O'zbek tilida apostrof harfning bir qismi, so'z ajratgichi emas.
$apostroflar = ["'", "\u{2018}", "\u{2019}", "\u{02BB}", "\u{02BC}"];
$matn = str_replace($apostroflar, "", $matn);
// 2-qadam: qolgan hamma narsani tire bilan almashtiramiz
$matn = preg_replace("/[^a-z0-9]+/u", "-", $matn) ?? "";
$matn = trim($matn, "-");
return $matn === "" ? "sahifa" : $matn;
}
$sarlavhalar = [
"Zamonaviy PHP dasturlash",
"O'zbekistonda IT ta'lim",
"Ma'lumotlar bazasi: PDO bilan ishlash",
" Bo'sh joylar ko'p ",
"!!!",
];
foreach ($sarlavhalar as $s) {
printf("%-42s -> %s\n", "\"{$s}\"", slugYasa($s));
}
"Zamonaviy PHP dasturlash" -> zamonaviy-php-dasturlash
"O'zbekistonda IT ta'lim" -> ozbekistonda-it-talim
"Ma'lumotlar bazasi: PDO bilan ishlash" -> malumotlar-bazasi-pdo-bilan-ishlash
" Bo'sh joylar ko'p " -> bosh-joylar-kop
"!!!" -> sahifa
Slug funksiyasini birinchi marta yozganda apostroflar maxsus ishlov olmagan edi va natija shunday chiqqandi:
| Sarlavha | Noto'g'ri natija |
|---|---|
O'zbekistonda IT ta'lim | ozbekistonda-it-ta-lim |
Ma'lumotlar bazasi | ma-lumotlar-bazasi |
ta'lim ta-lim ga aylanib qolgan: apostrof so'zni
ikkiga bo'lib yuborgan.
Sabab shundaki, apostrof o'zbek tilida harfning bir qismi - so'z chegarasi emas. Shuning uchun uni tire bilan almashtirish emas, butunlay olib tashlash kerak.
Ishni yanada chigallashtiradigan narsa - apostrofning bir necha xil yunikod belgisi bor va ular ko'zga bir xil ko'rinadi:
| Kod | Nomi | Qayerdan keladi |
|---|---|---|
U+0027 | Oddiy apostrof | Klaviaturadan |
U+2018 | Chap tirnoq | Word avtomatik qo'yadi |
U+2019 | O'ng tirnoq | Word avtomatik qo'yadi |
U+02BB | Tutuq belgisi | To'g'ri o'zbek imlosi |
U+02BC | Yumshatish belgisi | Yunikod tavsiyasi |
Foydalanuvchi matnni Word dan nusxa qilsa, u yerda
U+2019 bo'ladi - va oddiy ' bilan taqqoslash
ishlamaydi. Kod to'g'ri ko'rinadi, lekin natija xato.
Shuning uchun yuqoridagi funksiya ularning hammasini bir vaqtda olib tashlaydi. O'zbek tilidagi sayt yozayotgan bo'lsangiz, bu ro'yxatni eslab qoling.
- Bir xil matnni qo'shtirnoq va apostrofda chiqarib solishtiring.
- Massiv elementini qo'shtirnoq ichida
{}siz chiqarishga urinib ko'ring. - Heredoc bilan uch qatorli xat shabloni yozing.
- Nowdoc bilan xuddi shuni takrorlang - farqni ko'ring.
strposnatijasiniifda!== falsesiz tekshiring - nima bo'ladi?- Uni
str_containsga almashtiring. - Kirill matn uchun
strlenvamb_strlenni solishtiring. substrvamb_substrbilan kirill matnni kesib ko'ring.explodevaimplodebilan CSV qatorini qayta yig'ing.number_formatbilan narxni o'zbekcha formatda chiqaring.
Xulosa #
- Qo'shtirnoq o'zgaruvchini o'rniga qo'yadi, apostrof matnni aynan chiqaradi.
- Satr ichida har doim
{$ozgaruvchi}shaklini ishlating - u hech qachon adashtirmaydi. - Heredoc qo'shtirnoq kabi, Nowdoc apostrof kabi ishlaydi.
- PHP 7.3 dan beri heredoc yopuvchi belgisini chekintirish mumkin.
strpostopilmasafalse, birinchi belgida topilsa0qaytaradi -!== falsebilan tekshiring.- PHP 8 da
str_contains,str_starts_with,str_ends_withbor - ular tuzoqsiz. - Oddiy satr funksiyalari bayt bilan,
mb_funksiyalari belgi bilan ishlaydi. - Kirill harfi 2 bayt egallaydi -
substruni o'rtasidan kesib buzadi. - Foydalanuvchi matni bilan ishlaganda har doim
mb_versiyasini tanlang. printfchiqaradi,sprintfqaytaradi.- Foydalanuvchi matnini format satri sifatida ishlatmang:
printf("%s", $matn). - O'zbek matnida apostrof harfning qismi - slug yasashda uni tire qilmang, o'chiring.
- Apostrofning bir necha yunikod varianti bor (
U+0027,U+2019,U+02BB) - hammasini hisobga oling.
Keyingi bo'limda massivlar - PHP ning eng kuchli ma'lumot tuzilmasi bilan tanishamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.