PHPPamokos.lt


5. Darbas su tekstais

Dažniausias dalykas, su kuriuo susiduriame internete - tekstas. Čia sužinosime, kaip galima dirbti su tekstiniais kintamaisiais su PHP ir panaudosime reikalingas funkcijas.

Viengubos ir dvigubos kabutės

Pirma pasikartokime, apie ką jau buvome kalbėję - dėl kabučių. Eilučių reikšmių saugojimui gali būti naudojamos ir dvigubos kabutės, ir viengubos (apostrofai). Koks gi skirtumas? Jeigu jūsų teksto eilutėje tarp dvigubų kabučių bus nurodytas kintamasis su $ ženklu, tai PHP interpretuos jį kaip reikšmę, ir įrašys tą reikšmę vietoj kintamojo pavadinimo.

$kaina = 3.14;
echo "Kaina parduotuvėje buvo $kaina Lt";

Tekstines eilutes PHP kalboje galima saugoti ir tarp viengubų kabučių - su apostrofo ženklais: ' '. Tačiau šiuo atveju kintamieji tarp tų kabučių nebus pakeičiami į reikšmes, o tiesiog išvedamas kintamojo vardas.

$kaina = 3.14;
echo 'Kaina parduotuvėje buvo $kaina Lt';

Taip pat reikia atkreipti dėmesį į tokius atvejus, kai pačioje eilutėje reikia panaudoti viengubas ar dvigubas kabutes. Jeigu tarp viengubų kabučių reiia įterpti dvigubas, arba atvirkščiai, tai nieko blogo neįvyksta.

$kintamasis = 'Kauno "Žalgiris" laimėjo varžybas';
$kintamasis = "Kauno 'Žalgiris' laimėjo varžybas";

Bet jeigu tame pačiame kintamajame naudosite tas pačias kabutes, bus negerai:

$kintamasis = "Kauno "žalgiris" laimėjo varžybas";

Ši eilutė bus interpretuojama kaip klaidinga, ir skriptas nebus vykdomas, o ekrane bus parodyta klaida.

Kad taip neįvyktų, prieš kabutes pačioje reikšmėje reikia parašyti \ ženklą:

$kintamasis = "Kauno \"žalgiris\" laimėjo varžybas";
 

Funkcijos darbui su tekstais

Darbas su tekstinėmis eilutėmis yra tikrai dažnas reiškinys programavime, dėl to PHP kalboje yra paruošta tikrai daug naudingų funkcijų, kurias galima panaudoti.

Štai pavyzdžiai - prie kiekvienos funkcijos apačioje yra komentaras:

$eilute = " labas rytas, Lietuva! ";
$ilgis = strlen($eilute);

Funkcija strlen grąžina eilutės simbolių skaičių. Šiuo atveju - 23.

$eilute = " labas rytas, Lietuva! ";
$eilute_be_tarpu = trim($eilute);

Funkcija trim grąžina eilutę be tarpų pradžioje ir pabaigoje.

$didziosios_raides = strtoupper($eilute);

Funkcija strtoupper - pakeičia visas raides į didžiąsias

$mazosios_raides = strtolower($eilute);

Funkcija strtolower - pakeičia visas raides į mažąsias

$pavadinimas = ucfirst($eilute);

Funkcija ucfirst - pakeičia TIK pirmąją eilutės raidę į didžiąją

$tekstas = str_replace("Lietuva", "Latvija", $eilute);

Funkcija str_replace paima kintamąjį $eilute ir pakeičia visus tekste esančius žodžius "Lietuva" į "Latvija". Tiksliau, į tokius parametrus kuriuos mes nurodome.

$zodis = substr($eilute, 1, 5);

Funkcija substr grąžina žodžio dalį - šiuo atveju penkis simbolius, pradedant nuo antrojo. Apie substr reikia pakalbėti šiek tiek atskirai.

Visų pirma, reikia žinoti, kad simboliai tekste PHP kalboje yra numeruojami ne nuo 1, o nuo 0. Tai yra pirmoji teksto raidė yra iš tikro nulinė. Netgi galime pasiekti kiekvieną simbolį, jei žinome jo numerį tekste - į jį galime kreiptis, nurode jo numerį kvadratiniuose skliausteliuose:

echo $eilute[1]; // išves ANTRAJĮ simbolį, ne pirmąjį

Tai naudodami funkciją substr, nepamirškite, kad eilutė prasideda nuo nulinio numerio, vietoje numerio dar naudojamas terminas "indeksas" - bet apie tai dar kalbėsime, kai prieisime prie masyvų kitoje pamokoje.

echo substr($eilute, 0, 5); // išves pirmus penkis simbolius

Taip pat galima įvairiai papildomai pažaisti su substr funkcija. Kaip pavyzdys - trečias parametras yra nebūtinas, jei jo nenurodome - grąžinama eilutė nuo nurodyto simbolio iki pat pabaigos.

$eilute = "Lietuva";
echo substr($eilute, 5); // išves "va"

Maža to, parametrų reikšmės gali būti ir minusinės - jei pvz nežinome, kiek simbolių reikia paimti, bet žinome kiek simbolių tai turi būti nuo galo.

$eilute = "Lietuva";
echo substr($eilute, 1, -3); // išves "iet" - viską nuo 2-o simbolio, nurėš tris nuo galo
$eilute = "Lietuva";
echo substr($eilute, -5); // išves "etuva" - penkis simbolius nuo galo

Čia tik keletas iš dažniausiai naudojamų funkcijų, su visomis eilučių funkcijomis galima susipažinti oficialiajame PHP puslapyje: http://www.php.net/manual/en/ref.strings.php

Kaip matome, funkcijos yra iškviečiamos taip: pavadinimas ir skliausteliuose parametrai per kablelį. Nebūtina funkcijos rezultato priskirti kažkokiam kintamajam - galima jį naudoti iš karto kitiems tikslams:

echo strlen($eilute);
echo strtoupper($eilute) . " " . strtolower($eilute);

Taip pat svarbus ir dažnai pritaikomas dalykas - galima kviesti funkcijos rezultatą iškart kaip kitos funkcijos parametrą. Taip sakant, funkciją funkcijoje. Nereikia atskirai priskirinėti kintamųjų. Pvz vietoj:

$eilute2 = strtoupper($eilute);
echo strtolower($eilute2);
...galima rašyti trumpiau:

echo strtolower(strtoupper($eilute));

Vėliau apie funkcijas pakalbėsime atskirai ir plačiau – ne tik apie PHP funkcijų panaudojimą, bet ir savo naudingų funkcijų sukūrimą.

 

Funkcijos darbui su lietuviškomis raidėmis

Atskirai reikia paminėti mūsų šalies specifiką - turime daugiau abėcėlės raidžių nei lotyniškas alfabetas, taigi naudojame UTF-8 koduotę, kas reiškia kad kiekvienai mūsų specifinei raidei reikia ne vieno baito atminties, o dviejų. Dėl to išvardintos viršuje funkcijos gali neveikti su lietuviškais tekstais. Pavyzdys:

$title = "Žalgiris";
echo substr($title, 0, 1);

Lyg ir vienas pirmas simbolis, ar ne? Bet į naršyklę išves kažkokį neaiškų kringelį. Nes gaunasi, kad dviejų baitų Ž raidė yra skaidoma per pusę. Nesigilinant labiau į priežastis, tiesiog lietuviškiems (ir bendrai international) tekstams naudokite tas pačias funkcijas su priešdėliu mb_ - pvz mb_strlen(), mb_substr() ir t.t.

$title = "Žalgiris";
echo mb_substr($title, 0, 1);
 

Trumpai apie RegEx: Šablonų paieška teksto eilutėse

Tema, kurią bus sunku suprasti iš pradžių, galima laikyti ja "su žvaigždute", bet kadangi tai susiję su eilutėmis, tai prabėgsime - nepergyvenkite, jei nesuprasite, spragas užpildysime kitose pamokose. Taigi, gali prireikti patikrinti, ar teksto eilutė atitinka tam tikrą "šabloną" - ar tai yra korektiškas el.pašto adresas, ar tai yra telefono numeris, ar tai yra IP adresas ir t.t. Tokie patikrinimai dažniausiai atliekami su taip vadinamais "regular expressions" arba trumpiau "RegEx" operatoriais - nors RegEx yra visiškai atskiro straipsnio, galbūt netgi kurso tema, bet trumpai parodysiu kelis pavyzdžius.

Šablono struktūra susideda iš raidžių/skaičių ir tam tikrų skiriamųjų ženklų - įvardiname simbolius ir jų sekas, iš kurių gali susidaryti eilutė.

$pattern = 'test'; // tekste turi būti rastos raidės "test" - būtent tokia tvarka
$pattern = '^test'; // tekstas turi prasidėti nuo "test"
$pattern = 'test$'; // tekstas turi baigtis "test"
$pattern = '[abc]'; // turi būti rasta bent viena raidė - a, b arba c
$pattern = '[a-z]'; // turi būti bet kuri mažoji lotynų abėcėlės raidė
$pattern = '[0-9]+'; // turi būti rastas vienas arba daugiau skaitmenų
$pattern = '[A-Z]{3}'; // trys didžios lotynų abėcėlės raidės

Dabar klausimas - kur tuos šablonus panaudoti. Pavyzdys:

if (preg_match('/'.$pattern.'/', $text)) {
  echo "Tekstas atitinka šabloną.";
}

Kaip matote, panaudotas operatorius IF (apie jį kalbėsime vėliau) ir PHP funkcija preg_match(). Tai yra viena iš funkcijų, naudojančių "RegEx" technologiją. Kitų funkcijų pavyzdžiai - greičiausiai naujokams bus sunku jas suprasti, bet nenusiminkite - kaip ir sakiau, "RegEx" yra atskira sudėtinga tema, kurios paprastam darbui su PHP jums greičiausiai net neprireiks.

preg_replace("/(\d+)-(\d+)-(\d+)/", "$2/$3/$1", "2014-09-25");
// pakeisti tam tikrus simbolius pagal šabloną
preg_match_all("/<b>(.*)<\/b>/U", $userinfo, $array); // įrašo pasikartojančius šablonus į masyvą
$ip_array = preg_split("/\./", $ip); // atskiria elementus į masyvą

Taip pat gera žinia tai, kad PHP kūrėjai, suprasdami, kad kai kurie tekstų šablonai pasikartoja, supaprastino mums užduotį ir paruošė specialią filtro funkcija filter_var():

filter_var('povilas@phppamokos.lt', FILTER_VALIDATE_EMAIL); // patikrina, ar eilutė yra el.pašto adresas


(c) 2015-2018. Visais klausimais kreipkitės povilas@laraveldaily.com