Stringek

A string karakterek sorozata. PHP-ben egy karakter pontosan egy bytenak felel meg, így 256 különböző karakter lehetséges. Ez azt is jelenti, hogy a PHP-nek jelenleg nincs beépített Unicode támogatása.

Megjegyzés: Nem okozhat problémát a stringek körében, hogy túl hosszúvá válnak. Semmiféle korlát nem létezik a PHP által kezelt stringek méretére, ezért nem kell tartani a hosszú stringektől.

Szintaxis

A stringeket háromféleképpen lehet létrehozni.

String létrehozása aposztróffal

A legkönnyebben úgy adhatunk meg egy egyszerű stringet, hogy aposztrófok (' karakterek) közé tesszük.

Ha a stringben egy aposztófot szeretnél elhelyezni, és azzal nem a string végét szeretnéd jelezni, más nyelvekhez hasonlóan egy visszaperjel karaktert kell alkalmaznod az aposztóf előtt (\). Ha egy aposztróf, vagy a string vége előtt el szeretnél helyezni egy visszaperjelet, meg kell dupláznod azt. Figyelj arra, hogy ha bármilyen más karakter elé teszel visszaperjelet, a visszaperjel meg fog jelenni a stringben. Emiatt gyakran nincs szükség magának a visszaperjelnek a duplázására.

Megjegyzés: PHP 3 használatakor azonban egy E_NOTICE szintű figyelmeztetést kapsz, ha ezt kihasználod.

Megjegyzés: A többi móddal ellentétben a változók értékei nem helyettesítődnek be, ha aposztrófos stingben változókra hivatkozol.

echo 'Egyszerű string';
echo 'A stringekbe újsor karaktereket is építhetsz,
ilyen formában.';
echo 'Arnold egyszer azt mondta: "I\'ll be back"';
// kimenete: ... "I'll be back"
echo 'Are you sure you want to delete C:\\*.*?';
// kimenete: ... delete C:\*.*?
echo 'Are you sure you want to delete C:\*.*?';
// kimenete: ... delete C:\*.*?
echo 'Ezen a ponton próbálok beépíteni \n egy újsort';
// kimenet: ... beépíteni \n egy újsort

String létrehozása idézőjellel

Ha egy stringet idézőjelek (") közé helyezünk, a PHP több speciális jelölés feldolgozására lesz képes:

Táblázat 7-1. Speciális jelölések idézőjeles stringben

jelölésjelentése
\nújsor (LF vagy 0x0A (10) ASCII kódú karakter)
\rkocsivissza (CR vagy 0x0D (13) ASCII kódú karakter)
\tvízszintes tabulátor (HT vagy 0x09 (9) ASCII kódú karakter)
\\visszaperjel
\$dollárjel
\"idézőjel
\[0-7]{1,3} egy karaktersorozat, ami oktális számokra illeszkedik
\x[0-9A-Fa-f]{1,2} egy karaktersorozat, ami hexadecimális számokra illeszkedik

Ha bármilyen más karakter elé visszaperjelet írsz, ebben az esetben is ki fog íródni a visszaperjel.

A legfontosabb előnye az idézőjeles stringeknek az, hogy a változók behelyettesítésre kerülnek. Lásd a változók behelyettesítése című részt további részletekért.

String létrehozása heredoc szintaxissal

Egy másfajta módszer a stringek megadására a heredoc szintaxis ("<<<"). [ez itt megint nem elírás, kedves unix-shell programozó!] A <<< jelzés után egy azonosítót kell megadni, majd a stringet, és végül az azonosítót mégegyszer, ezzel zárva le a stringet.

A lezáró azonosítónak mindenképpen a sor legelső karakterén kell kezdődnie. Ugyancsak figyelni kell arra, hogy ez az azonosító is az általános PHP elemek elnevezési korlátai alá tartozik: csak alfanumerikus karaktereket és aláhúzást tartalmazhat, és nem kezdődhet számjegy karakterrel.

Figyelem

Nagyon fontos, hogy odafigyelj arra, hogy a lezáró azonosítót tartalmazó sor ne tartalmazzon semmi mást, csupán esetleg egy idézőjel (;) karaktert. Ez még pontosabban azt is jelenti, hogy az azonosító nem lehet beljebb kezdve, és nem szabad semmilyen szóköz vagy tabulátor karaktert sem elhelyezni a pontosvessző előtt vagy után.

Feltehetően a legkellemetlenebb korlátozás az, hogy még egy kocsivissza (\r) karakter sem lehet a sor végén, csak egy újsor (\n) szerepelhet. Mivel a Microsoft Windows a \r\n sorozatot használja a sorok végének jelzésére, a heredoc nem fog működni, ha olyan szerkesztőben készíted a programod, ami ezt a sorvég jelzést használja. A legtöbb fejlesztőeszköz azonban lehetőséget ad UNIX sorvégjelzéssel ellátott állományok mentésére.

A heredoc az idézőjeles stringekhez hasonlóan működik, az idézőjelek nélkül. Ez azt jelenti, hogy nem kell visszaperjellel jelülni az idézőjeleket a szövegben, de a fenti speciális jelölések használhatóak. A változók értékei behelyettesítődnek, de az idézőjeles karaktersorozatokhoz hasonlóan gondosan kell ügyelni a komplex változó hivatkozások megadására.

Példa 7-2. "Heredoc" string példa [VAS: Vége A Stringnek de helyette lehet bármi]

<?php
$str = <<<VAS
Példa egy stringre, amely
több sorban van, és heredoc
szintaxisú
VAS;

/* Komplexebb példa, változókkal. */
class ize
{
    var $ize;
    var $valami;

    function ize()
    {
        $this->ize = 'Valami';
        $this->valami = array('elso', 'masodik', 'harmadik');
    }
}

$ize = new ize();
$nev = 'Béla';

echo <<<VAS
A nevem "$nev". Kiírok egy értéket: $ize->ize.
Most kiírok egy tömbelemet: {$ize->valami[1]}.
Ez nagy 'A' kell, hogy legyen: \x41
VAS;
?>

Megjegyzés: A heredoc a PHP 4-esben került a nyelvbe.

Változók behelyettesítése

Ha egy stringet idézőjelek között, vagy heredoc szintaxissal adsz meg, a jelölt változók értékei behelyettesítésre kerülnek.

Kétféleképpen lehet megadni egy változót, az egyszerű és a komplex formátummal. Az egyszerű forma a leggyakoribb és legkényelmesebb. Lehetőséget ad egy skalár, tömb érték vagy egy objektum tulajdonság beillesztésére.

A komplex szintaxis a PHP 4-es változatában került a nyelvbe, és a jelölésben használatos kapcsos zárójelekről ismerhető fel.

Egyszerű szintaxis

Ha dollár ($) jelet talál a PHP egy stringben, mohón megkeresi az összes ezt követő azonosítóban is használható karaktert, hogy egy érvényes változónevet alkosson. Használj kapcsos zárójeleket, ha pontosan meg szeretnéd határozni, meddig tart egy változó.

$ingatlan = 'ház';
echo "kertes $ingatlan kerítéssel"; // működik, szóköz nem lehet változónévben
echo "páros $ingatlanszám"; // nem működik, az 's' és további karakterek lehetnek változónévben
echo "páros ${ingatlan}szám"; // működik, mert pontosan meg van adva a név

Hasonlóképpen meg lehet adni tömbindexet vagy objektum tulajdonságot is. A tömbindexek esetében a záró szögletes zárójel (]) jelöli az index végét, az objektum tulajdonságoknál az egyszerű skalárok szabályai érvényesek, habár objektum tulajdonágok esetén nem használható a fenti trükk.

$gyumolcsok = array( 'eper' => 'piros' , 'alma' => 'zöld' );
echo "Az alma $gyumolcsok[alma]."; // ez másképpen használandó karaktersorozatokon kívül. 
// Lásd az $ize[valami] karakterláncon kívüli problémáját

echo "A négyzet $negyzet->szelesseg méter széles.";

echo "A négyzet $negyzet->szelesseg00 centiméter széles."; // nem működik
// A megoldás érdekében lásd a komplex szintaxis szakaszt!

Bármely ennél komplexebb helyettesítéshez a komplex szintaxis használatos.

Komplex (kapcsos zárójeles) szintaxis

Ezt nem azért nevezzük komplexnek, mert a szintaxis komplex, hanem azért, mert így komplex kifejezések helyettesítésére nyílik lehetőség :).

Gyakorltilag bármilyen változó érték behelyettesíthető ezzel a szintaxissal. Egyszerűen úgy kell megadni az értéket adó kifejezést, mintha a stringen kívül dolgoznál vele, és utána { és } jelek közé kell zárni. Mivel a '{' jel megadására nincs speciális jelölés, ez a forma csak akkor fog működni, ha a { után közvetlenül egy $ jel található. (Használhatod a "{\$" vagy "\{$" jelöléseket, ha a stringben a "{$" sorozatot szeretnéd beilleszteni, és nem változóhelyettesítést adsz meg). Néhány példa, ami tisztázhatja a félreértéseket:

$oriasi = 'fantasztikus';
echo "Ez { $oriasi}"; // nem működik, kiírja, hogy : Ez { fantasztikus}
echo "Ez {$oriasi}";  // működik, kiírja, hogy: Ez fantasztikus
echo "Ez a négyzet {$negyzet->szelesseg}00 centiméter széles.";
echo "Működik: {$tomb[4][3]}";
echo "Hibás: {$tomb[ize][3]}"; 
   // ennek ugyanaz az oka, mint ami miatt
   // a $ize[valami] hibás egy stringen kívül

echo "Ebben a formában már helyes: {$tomb['ize'][3]}";
echo "Akár ezt is írhatod: {$obj->ertekek[3]-&gt;nev}";
echo "Ez a $nev nevű változó értéke: {${$nev}}";

String karaktereinek elérése

A string karaktereire nullától számozott indexekkel lehet hivatkozni, a string neve után megadott kapcsos zárójelek között.

Megjegyzés: Kompatibilitási okokból a tömböknél használatos szögletes zárójelek is alkalmazhatóak a karakterek eléréséhez. Ez a tömb jelzés azonban nem javasolt a PHP 4-esben.

Példa 7-3. Néhány string példa

<?php
/* String hozzárendelése */
$str = "Ez egy string";

/* Hozzáfűzés */
$str = $str . " több szöveggel";

/* Hozzáfűzés egy más módja újsor karakterrel a végén */
$str .= " és egy újsor a végére.\n";

/* Ez a string végülis ilyen lesz: '<p>Szám: 9</p>' */
$num = 9;
$str = "<p>Szám: $num</p>";

/* Ez meg: '<p>Szám: $num</p>' */
$num = 9;
$str = '<p>Szám: $num</p>';

/* A string első karaktere kerül first-be  */
$str = 'Ez egy teszt.';
$first = $str{0};

/* Most meg az utolsó */
$str = 'Ez még mindig egy teszt';
$last = $str{strlen($str)-1};
?>

Hasznos függvények

Stringeket a '.' (pont) stringösszefűző operátorral tudsz összefűzni. A '+' (összeadás) operátor nem alkalmas erre a feladatra. Lásd a String operátorok című részt további információkért.

Számos hasznos függvény létezik stringek manipulálásához.

Lásd a string függvények című részt általános függvényekért, a reguláris kifejezés függvényeket fejlett kereséshez és cserékhez (két formában: Perl és POSIX kiterjesztett).

Külön függvények léteznek URL stringekhez, és stringek kódolásához/dekódolásához (mcrypt és mhash kódolások).

Végül ha ezek között sem találod, amit keresel, lásd a karakter típus függvényeket.

String konverziók

Amikor egy string számként értékelődik ki, az eredmény típusa a következőképp kerül meghatározásra.

A string lebegőpontosként értékelődik ki, ha a '.', 'e', vagy 'E' karakterek bármelyikét tartalmazza. Egyébként egészként értékelődik ki.

Az érték meghatározása a string első karakterei alapján történik. Ha a string érvényes számmal kezdődik, ez az érték kerül felhasználásra. Máskülönben az érték 0 lesz [nulla, nem nagy O betű]. Érvényes számnak tekintendő, amelynek opcionális előjelét egy vagy több számjegy követi (melyben lehet egy tizedespont), végül lehet exponense. Az exponens egy 'e' vagy 'E' karakter, melyet egy vagy több szám követ.

$foo = 1 + "10.5";                // $foo most float (11.5)
$foo = 1 + "-1.3e3";              // $foo most float (-1299)
$foo = 1 + "bob-1.3e3";           // $foo most integer (1)
$foo = 1 + "bob3";                // $foo most integer (1)
$foo = 1 + "10 Kicsi Pingvin";    // $foo most integer (11)
$foo = 4 + "10.2 Kicsi Pingvinke" // $foo most integer (14)
$foo = "10.0 disznó " + 1;        // $foo most integer (11)
$foo = "10.0 disznó " + 0.5;      // $foo most float (10.5) [szóval 10 disznó, meg egy féldisznó]

Ha többet szeretnél megtudni erről a konverzióról, akkor nézd meg a Unix manualt strtod(3). [=RTFM]

Ha szeretnéd kipróbálni valamelyik fejezetbeli példát, elmásolhatod innen a példákat és beszúrhatod az alábbi sort, hogy lásd mi is történik.

[Ahhoz nem árt azért előbb érteni a beszúrt sort. A beszúrandó string elején a "\" azért van, hogy a $foo helyére NE a foo változó értéke kerüljön, hanem a \$ hatására a $ karakter íródjon ki, majd a foo karaktersor, egy egyenlőségjel, és utána a $foo változó értéke. Az első "\" hatására ugyanis a köv. karakter ("$") elveszti különleges jelentését, és kimásolódik a kimenetre, majd jön a "foo=" szöveg, ez is úgy, ahogy van a kimenetre kerül, a fordító nem is találkozott változóval, amit be kellene helyettesíteni. Aztán jön a $foo, ezt már felismeri a fordító, és a változó értékét írja ki]:

echo "\$foo==$foo; típusa " . gettype ($foo) . "<br />\n";