Samizdatová skripta

Řetězce


 <?php
$text="   <p>Takto do proměnné přiřadíme text.   </p>";

echo "Piš.   <br>";  //Můžeme též vypisovat HMTL značky

echo strlen("Piš.");

echo 	STRTOUPPER($text);//převede řetězec obsažený v proměnné $text na velká písmena a vypíše ho
  
echo 	STRIP_TAGS($text);// odstraní z řetězce $text HMTL a PHP značky a vypíše řetězec


echo "   <p>příkaz explode:   </p>";

$text2=explode(' ',STRIP_TAGS($text));//vnořování funkcí je také povoleno

echo  $text2[0];echo "   <br>";
echo  $text2[1];echo "   <br>";
echo  $text2[2];echo "   <br>";
echo  $text2[3];echo "   <br>";
echo  $text2[4];echo "   <br>";

echo "   <p>spojování řetězců   </p>";
echo "Zbytek po děleni 10:3 je ". (10 % 3) ;// znak "%"= zbytek po celočíselném dělení


?>

PHP obsahuje mnoho funkcí pro prác s řetězci, popíšeme jen některé. Kompletní seznam lze nalézt v manuálu.

$text=“Takto do poměné přiřadíme text.“;

EXPLODE (“oddělovač“, “rozdělovaný řetězec“); - viz příklad.

Operátory pro spojování řetězců

Pro spojování řetězců slouží speciální operátor ' . '.

Funguje tak, že své operandy převede nejprve na znakové řetězce a pak je spojí v jeden řetězec.

echo "Zbytek po děleni 10:3 je ". (10 % 3);

Okolo operátoru můžeme napsat mezer, kolik chceme, a zpřehlednit tak program:

echo "Zbytek po dělení 10:3 je " . (10 % 3);

Pokud potřebujeme k nějaké proměnné připojit řetězec, můžeme samozřejmě použít následující postup:

$s = $s . "a něco málo na konec řetězce";

Pro tyto případy však s výhodou využijeme operátor '.=': $s .= "a něco málo na konec řetězce"

V případě, že funkce strtolower, resp. strtoupper použijeme na řetězec v UTF-8, dostane velmi nekorektní výsledek. Proto doporučuji následujcí postup.

   <?php
$str = "TeXt";
$str = mb_convert_case($str, MB_CASE_LOWER, "UTF-8");
echo $str;
  ?>
 

Poznámka: Funkce pro práci s řetězci neupravují přímo obsah řetězce, který je uveden v argumentu funkce, ale je potřeba výsledek vypsat nebo přiřadit do proměnné.

V php lze použít i apostrofy místo uvozovek. Jejich použití je stejné, až ne pár drobných rozdílů. Uvnitř řetezců v apostrofech nelze použivat unikové sekvence (s vyjímkou vložení apostrofů), ani názvy proměnných. Veškeré znaky budou interpetovány tak, jak jsou napsány ve zdrojovém kódu.

PHP - a práce s řetězci v UTF*

Velký problém PHP5 je v tom, že i přes dávné sliby vývojářů4 vůbec neobsahuje podporu Unicode. Zatímco jiná prostředí pro tvorbu aplikací jako Jáva nebo .NET mají přímo datový typ znak Unicode a řetězec takových znaků, PHP nic takového nenabízí. PHP totiž ve skutečnosti nepracuje s textovými řetězci složenými ze znaků, ale s posloupnostmi binárních dat složených z bajtů. Jak se to projevuje prakticky? Představme si, že do proměnné pozdrav uložíme řetězec „čau":

Spozdrav = "čau";

Jeden by si mohl myslet, že proměnná $pozdrav obsahuje textový řetězec skládající se ze n znaků „č", „a" a „u". Ale ve skutečnosti se řetězec skládá z bajtů, které v souboru se skriptem tyto tři znaky reprezentovaly. Ty budou jiné, bude-li skript uložen v kódování windows-1250 nebo iso-8859-2. Jiné budou i v kódování UTF-8 a navíc to už nebudou bajty tři, ale dokonce čtyři, protože písmeno „č" je v UTF-8 reprezentováno dvěma bajty. hod ni ^°^ec* si tohoto drobného nedostatku nevšimneme, protože třeba při vypisování not to nevadí. Použijeme-li příkaz:

echo Pozdrav;

tak se do výstupu zkrátka zapíší bajty odpovídající řetězci „čau" v kódování skriptu, a pokud je generované stránky stejné, prohlížeč zobrazí korektní text.

 <!DOCTYPE  HTML  PUBLIC  '-//W3C//DTD  HTML  4.01//EN'>  <html  lang="cs">  <head>
 <meta http-equiv="content-type"  content="text/html;charset=windows-1250">  <title>Demonstrace špatné podpory Unicode  Sndash;  stránka v kódování *• windows-1250 </title>  </head>  <body>  <?php
$text[]  =  "Text bez diakritiky";
$text[]  =  "Český text";
$text[]  = "Text se  speciálními  znaky -  (pomlčka),  „uvozovky"";
foreach  ($text as  $retezec) {
echo  "Řetězec:  "  .  $retezec  .  " <br>\n";
echo "Délka řetězce:  "  .  strlen ($retezec)  .  " <br>\n";
 </body>  </html>
Nyní skript beze změny uložíme v kódování UTF-8 a jen změníme identifikaci kódování v meta tágu.
Příklad 32: Skript vypisující délku řetězců (skript je v kódování utf-8) - unicode/
retezec-utf-8.php
 <!DOCTYPE  HTML  PUBLIC  '-//W3C//DTD HTML  4.01//EN'>
 <html  lang="cs">
 <head>
 <meta http-equiv="content-type"  content="text/html;charset=utf-8">  <title>Demonstrace špatné podpory Unicode –  stránka v kódování utf-8 </* title>
 </head>
 <body>  <?php
$text[]  =  "Text bez diakritiky";
$text[]  =  "Český text";
$text[]  =  "Text se  speciálními  znaky -  (pomlčka),  „uvozovky"";
foreach  ($text as  $retezec)
  { echo  "Řetězec:  "  .  $retezec  .  " <br>\n";
    echo "Délka řetězce:  "  .  strlen ($retezec)  .  " <br>\n";
    }
    
?>
 </body>  </html>

Nyní skript beze změny uložíme v kódování UTF-8 a jen změníme identifikaci kódování v meta znace.

Člověk by očekával, že výstup z těchto skriptů bude identický. Jak je však vidět na obrázku uložený v kódování UTF-8 nadhodnocuje skutečnou délku řetězců. Výsledek je špatně, protože funkce strlen () nepočítá počet znaků, ale bajtů uložených v řetězci. A při skriptu v kódování UTF-8 jsou znaky s českou diakritikou reprezentovány jako dva bajty, a ne jako jeden bujt při použití windows-1250.

 <?php
$text[]  =  "Text bez diakritiky";
$text[]  =  "Český text";
$text[]  =  "Text se  speciálními  znaky -  (pomlčka),  „uvozovky";
foreach  ($text as  $retezec)
echo  "Řetězec:  "  .  $retezec  .  " <br>\n";
echo  "Délka řetězce:  "  .  strlen (iconv ("utf-8",  "windows-1250",  $retezec) ) .  " <br>\n";
?>

Jak vidíme na obrázku 3.4, české texty se do kódováni' windows-1250 dají převést bez problémů. Toto kódováni' však neumí reprezentovat znaky azbuky, a proto funkce ohlásí chybu při konverzi textu v ruštině.

Notice: iconvQ [function. i couv]: Detected an illegal character in input string in pokus.php on line 19 Délka řetězce: 0.

Tento přístup proto můžeme použít pouze v případě, kdy máme jistotu, že text bude obsad hovat znaky reprezentovatelné ve zvoleném jednobajtovém kódování. Psát aplikace tímto způsobem je však poměrně krátkozraké, protože nikdy dopředu nevíme, kdy vyvstal požadavek na zápis textů v jiných jazycích.

Rozhodneme-li se psát aplikace takto omezeně, je pak otázkou, proč se trápit s konverzí mezi UTF-8 a dalšími kódováními. Nebylo by jednodušší psát skripty rovnou třeba v kodování windows-1250 nebo iso-8859-2 a nestarat se o žádné konverze? Možná bylo, ale ne v případě, kdy pracujeme s domumenty XML. Všechny knihovny pro práci s XML v PHP se totiž chovají tak, že textové řetězce obsažené v dokumentech XML mají v paměti reprezentovány v kódování UTF-8. Nezáleží přitom na tom, v jakém kódování byl původní dokument uložen. Tato konverze se provádí, protože kódování UTF-8 je schopné reprezentovat.

Kdybychom tedy měli jednoduchý dokument XML uložený v kódování windows-1250 a jednoduchý skript v témže kódování, který data z XML čte, dostali bychom na výstupu nesmyslné znaky, protože dokumnet XML se automaticky načítá pomocí knihovny SimpleXML překóduje do UTF-8. Když pak tento text bez úprav vypíšeme mezi ostatní výstupy skriptu, které jsou v kódování windows-1250, dostaneme samozřejmě nesmysly. V tomto případě je proto potřeba zase využít funkci inconv(), tentokráte pro převod řetezců z UTF-8 do kódování použiteho skriptem.

Vidíme, že překódování jedním i druhým směrem skript zbytečně komplikuje. V dnešní době je proto nejlepší, zvláště pracujeme-li hodně s XML, psát skripty výhradně v kódování UTF-8. V tomto kódování je pak nutné generovat i výstup a načítat všechny vstupy - např. dokumenty XML a informace z databáze. To, že standardní řetězové funkce PHP nepracují dobře s textem v UTF-8, musíme vyřešit jinak, nejlépe pomocí Knihovny mbstring.

http://www.php.net/manual/en/ref.mbstring.php

*Převzato z knihy XML a PHP, Kosek Jiří

http://php.net/manual/en/ref.mbstring.php

upravit odstranit css

NAVRCHOLU.cz