Učíme se PHP online a nekupujem knihy :o)

>> Pro všechny, kdo mají rádi tento jazyk nebo pro ty, kteří se v něm chějí zdokonalit.



Lekce 16: Stringy II




- Zde je druhý díl pro práci se stringy. Takže stejně tak jako v prvním díle, si i zde představíme několik příkazů, které nám mohou ulehčit práci.


Práce s textem


- První funkcí, kterou bych vám ukázal bude strpos(), která hledá pozici prvního výskytu řetězce.
- Funkce má 3 parametry, kde první je string, ve kterém se má hledat, druhý je string, který hledám a třetí je offset.

$text = "Dnes je super den";
$hledam = "super";

// slovo "super" tak existuje, tak vypise "Je tam: super"
if (strpos($text, $hledam) !== false) echo "Je tam: ".$hledam;

// ten sami zapis
if (!strpos($text, $hledam) === false) echo "Je tam: ".$hledam;
Pozor: Tato funkce porovnává i typ, takže je nutné použít !==.

- Funkce má i 3 parametr - offset.
$text = "Dnes je super den";
$hledam = "u";

// vypise OK, protoze pismeno "u" je na 10 pozici a my zaciname od 9
if (strpos($text, $hledam, 9) !== false) echo "OK";

// nevypise nic, protoze hledame az od 10 pozice (tj. 11+)
if (strpos($text, $hledam, 10) !== false) echo "OK";
- Jako další funkci bych představil substr(), která vrací část stringu.
- Tato funkce má opět 3 parametry, kde první je string, druhý je start (pozice kde se má začít) a třetí je délka.

- Řekněme, že budeme mít soubory, které budou mít vždy příponu složenou ze 3 znaků a my budeme chtít vypsat pouze příponu.
echo substr("soubor.exe", -3); // vypise "exe" (vezme posledni 3 znaky)
echo substr("soubor.exe", 0, 6); // vypise "soubor" (vezme prvnich 6 znaku)
- Zde není moc co dodat. Ukážu ještě pár příkladů a jen připomenu, že pokud startovní pozice je záporná, tak začínáme v textu od zadu.
// krajeni textu ze predu
echo substr("a10_b20_c30", 0, 3); // a10
echo substr("a10_b20_c30", 1, 2); // 10
echo substr("a10_b20_c30", 4, 3); // b20
echo substr("a10_b20_c30", 5, 2); // 20
echo substr("a10_b20_c30", 8, 3); // c30
echo substr("a10_b20_c30", 9, 2); // 30

// krajeni textu zezadu
echo substr("a10_b20_c30", -3);      // c30
echo substr("a10_b20_c30", -2);      // 30
echo substr("a10_b20_c30", -7, -4);  // b20
echo substr("a10_b20_c30", -6, -4);  // 20
echo substr("a10_b20_c30", -11, -8); // a10
echo substr("a10_b20_c30", -10, -8); // 10

// ostatni moznost pro rozdeleni textu
echo substr("a10_b20_c30", 0);  // a10_b20_c30
echo substr("a10_b20_c30", 4);  // b20_c30
echo substr("a10_b20_c30", 8);  // c30
echo substr("a10_b20_c30", -7); // b20_c30
- Jako další užitečná funkce bude wordwrap(). A jak už název říká, tak tato funkce slouží na zalomení textu.
- Funkce má 4 parametry, kde první je náš string a další 3 se sebou souvisejí. To znamená, že je nutné zadat všechny 3. Kde druhý parametr je počet znaků, po kterých se má text "zalomit", třetí udává značku, která se aplikuje každý počet znaků z druhého parametru a poslední parametr zapíná zalomení textu, pokud bude delší než zalamovací počet znaků.
- Přesněji to uvedu na příkladech.
$text = "Rozbity bagr"; // text

// vypise: "Rozbity
Bagr" echo wordwrap($text, 4, "
"); // za kazdy 4 znaky prida
- Tady vidíte, že jakmile je slovo delší, než 4 znaky, tak ho napíše celé a na jeho konci aplikuje teprve nový řádek. Aby jsme tomu zabránili a rozdělili slovo, i když bude delší, tak k tomu slouží poslední parametr, který ignoruje délku slova.
$text = "Rozbity bagr"; // text

// vypise: "Rozb
ity
bagr" echo wordwrap($text, 4, "
"); // opet za kazdy 4 znaky prida
- Všimněte si, že se zde berou i mezery, proto za "ity " je mezera.
- Samozřejmě nemusíme zadávat pouze nový řádek, lze zadat prakticky cokoliv.
$text = "Rozbity bagr"; // text

echo wordwrap($text, 2, "-", true); // Ro-zb-it-y-ba-gr
- Opět zde vidíme, že za "y" je hned pomlčka místo mezery, protože tam bývala mezera.
- Ukážem si ještě jeden příklad, kde lepší efektivitu uvidíme u obrovského čísla, kde nejsou žádné jiné znaky.
// trochu delsi cislo
$cislo = "1234567890123456789012345678901234567890123456789012345678901234567890";

/* vypise:
 * 123456789012
 * 345678901234
 * 567890123456
 * 789012345678
 * 901234567890
 * 1234567890
 */
echo wordwrap($cislo, 12, "
", true); // za kazdych 12 znaku da novy radek
- Tento poslední příkaz nejde použít bez zalomení textu (poslední parametr), protože text neobsahuje žádné mezery.

- Jako další hodně užitečnou funkcí je htmlspecialchars() nebo chcete-li htmlentities(). Tyto funkce převádí speciální znaky do HTML entit.
- Má celkem 4 parametry, které si ukážeme během příkladů. Jako první parametr je vstupní text, který obsahuje HTML tagy.
// vystup bude vypadat: "<a href="#">neco</a>"
echo htmlspecialchars('neco');
- Tohle nám způsobí, že na webu se neukáže výstup HTML, ale jako pouhý text (tak jak ho vidíme).

- Znaky které to převádí jsou:

- & - (ampersand) na &
- " - (uvozovky) na " pokud flag ENT_NOQUOTES není nastaven
- ' - (apostrofy) na ' pouze pokud flag ENT_QUOTES je nastaven
- < - (menší než) na &lt;
- > - (větší než) na &gt;

- Nyní se dostáváme k druhému parametru a to jsou flagy.
- Flagy už známe z jiných funkcí, ale pro připomenutí je to tag, který přikazuje funkci co nebo jak má dělat.

- Flagy pro tuto funkci tedy jsou:

- ENT_COMPAT - výchozí nastavení, ponechává pouze apostrofy
- ENT_QUOTES - pokud je nastaven, tak uvozovky i apostrofy jsou převedeny do entit
- ENT_NOQUOTES - pokud je nastaven, tak uvozovky i apostrofy nejsou převedeny do entit
- ENT_IGNORE - tiše zbavuje kód neplatných sekvenčních jednotek místo toho, aby nevypsal nic (z bezpečnosti bych to nepoužíval)
$html = '';

echo htmlspecialchars($html, ENT_COMPAT);   // naprosto stejne i bez flagu
echo htmlspecialchars($html, ENT_QUOTES);   // naprosto stejne i bez flagu
echo htmlspecialchars($html, ENT_NOQUOTES); // ponecha vsechny uvozovky i apostrofy
echo htmlspecialchars($html, ENT_IGNORE);   // tez ponecha vsechny uvozovky i apostrofy
- Nyní si ukážeme třetí parametr, který udává znakovou sadu. Pojďme si tedy ukázat možné sady pro převod.

- ISO-8859-1 : (ISO8859-1) - západní Evropa, Latin-1 (výchozí)
- ISO-8859-15 : (ISO8859-15) - západní Evropa, Latin-9, přidá znak eura a přidá písmena pro Francii a Finsko
- UTF-8 - ASCII kompatabilní s multi-byte, 8-bit unicode znaky
- cp866 : (ibm866, 866) - DOS, specifické znakové sady azbuky
- cp1251 : (Windows-1251, win-1251, 1251) - Windows, specifické znakové sady azbuky
- cp1252 : (Windows-1252, 1252) - Windows, specifické znakové sady západní Evropy
- KOI8-R : (koi8-ru, koi8r) - Ruská znaková sada
- BIG5 : (950) - tradiční Čínská, používaná hlavně na Taiwanu
- GB2312 : (936) - zjednodušená Čínská sada (národní standard)
- BIG5-HKSCS - Hong Kong rozšíření a tradiční čínská
- Shift_JIS : (SJIS, 932) - Japonská (měla by být zjednodušená)
- EUC-JP : (EUCJP) - Japonská


- Pokud nastavíme pro převod znakovou sadu, tak si musíme být jisti, že text je též v té znakové sadě.
- Takže pokud budeme třeba převádět japonský text s HTML tagy, tak musíme použít EUC-JP, protože naše Evropská sada na to nestačí.
- K tomu příklad ani uvádět nebudu, myslim, že to je celkem jasný. Takže pojďme na poslední parametr.
- Poslední parametr je vždy zapnutý, pokud ho vypnem, tak se nebudou kódovat již existující HTML entity.
echo htmlspecialchars("&gt;", ENT_NOQUOTES, null);        // &amp;gt;
echo htmlspecialchars("&gt;", ENT_NOQUOTES, null, false); // &gt;
- Opakem těchto funkcí je funkce html_entity_decode(), která převádí zpět všechny HTML entity do znaků.
- Má stejné možnosti i počet parametrů, jen se liší tím, že výchozí znaková sada je v UTF-8 a nemá flag ENT_IGNORE.

- Další celkem užitečná funkce je parse_str(), která převede řetězec do proměnných.
- Funkce má dva parametry, kde první je vstupní string a druhý možná reference na pole.
// rekneme, ze budeme mit nejakou URL kde bude tento dotaz
$url = "id=members&page=12&user=admin&ip=10.20.30.40";

parse_str($url); // rozdelime text a vytvorime promenne

echo $id;   // members
echo $page; // 12
echo $user; // admin
echo $ip;   // 10.20.30.40
- Pokud zadáme druhý parametr pro referenční pole, tak se proměnné nevytvoří, ale zapíší se do pole. To znamená, že budeme volat hodnoty přes jednu proměnnou pomocí indexu.
$url = "id=members&page=12&user=admin&ip=10.20.30.40";

parse_str($url, $u);

echo $u["id"];   // members
echo $u["page"]; // 12
echo $u["user"]; // admin
echo $u["ip"];   // 10.20.30.40
- Na parsování URL máme však jinou funkci, která se na to hodí nejlépe a to parse_url().
- Funkce má též 2 parametry, kde první je vstupní text v podobě celého URL a druhý je komponenta (ukážem si níže).
// budeme mit treba takovou URL
$url = "http://admin:password@mujweb.cz:80/cesta?args=hodnota#neco";

$pole = parse_url($url);
- Nyní nám proměnná $pole ukazuje toto:
array
  'scheme' => string 'http'
  'host' => string 'mujweb.cz'
  'port' => int 80
  'user' => string 'admin'
  'pass' => string 'password'
  'path' => string '/cesta'
  'query' => string 'args=hodnota'
  'fragment' => string 'neco'
- Takže není už problém si zavolat přesně to, co potřebujem. Třeba uživatele a heslo.
echo $pole["user"]; // admin
echo $pole["pass"]; // password
- Druhý parametr označuje komponentu, kde si můžeme přesně říct, co chceme získat. Takže se nepřevádí celá URL do pole, ale vratí se pouze ten string.
- Pokud to ta URL obsahovat nebude, tak vrací null.
- Pojďme si tedy ukázat základní komponenty, které můžeme v URL volat.

- PHP_URL_SCHEME - určuje, zda se jedná o http, https, ftp apod.
- PHP_URL_HOST - webová stránka, třeba "mujweb.cz"
- PHP_URL_PORT - port přenosu (jako jediný vraci typ int)
- PHP_URL_USER - uživatelské jméno
- PHP_URL_PASS - uživatelské heslo
- PHP_URL_PATH - cesta k souboru
- PHP_URL_QUERY - URL dotaz
- PHP_URL_FRAGMENT - vše, co je za kotvou (sharpem) #

- Když už známe komponenty, tak je zkusíme použít opět na získání jména a hesla.
echo parse_url($url, PHP_URL_USER); // admin
echo parse_url($url, PHP_URL_PASS); // password


Dobrovolný domácí úkol


- Vše potřebné jsem napsal, takže si stačí pouze opakovat.


This page was loaded in 0.405495 seconds. © 2011-2025 by mimic | mimic.php5.cz
ICQ contact is 204-517-399