Regulární výrazy představují velmi silný nástroj pro práci s textem, který je velmi známý z unixových systémů.
Znalosti regulárních výrazů můžete využít mnohem šířeji, než pouze v PHP. Regulární výrazy pronikly snad do všech oblastí zpracování textů.
Regulární výrazy jsou tedy velmi silným a univerzálním nástrojem pro zpracování textů, pomocí kterého můžete:
- vytahovat z textů údaje, které vás zajímají
- velmi efektivně vyhledávat v textech
- nahrazovat v textech vzájemně různé údaje
Tester regulárních výrazů
Protože bude potřeba regulární výrazy testovat, vytvoříme si alespoň malý tester pro regulární výrazy. Jeho funkci teď nebudu vysvětlovat, potřebné znalosti k pochopení funkce testeru získáte v průběhu dalšího čtení.
<html>
<head>
<title>Příklad 1. z 16. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<h1>Tester regulárních výrazů</h1>
<?php
if (!isset($reg_vyraz))
$reg_vyraz = ``;
if (!isset($text))
$text = ``;
?>
<form action="" method="post">
<b>Regulární výraz:</b>
<input type="text" name="reg_vyraz" value="<?php echo $reg_vyraz; ?>">
<br>
<b>Text:</b>
<input type="text" name="text" value="<?php echo $text; ?>">
<br>
<input type="submit" value="Porovnat text vůči regulárnímu výrazu">
<br>
</form>
<?php
if (@ereg($reg_vyraz, $text, $pole_vysledku))
echo `Regulárnímu výrazu vyhovuje: `,$pole_vysledku[0];
else
echo `Text nevyhovuje regulárnímu výrazu`;
?>
</body>
</html>
Tento tester můžete použít k ověřování regulárních výrazů v tomto díle seriálu.
První regulární výrazy
Nejjednodušším regulárním výrazem je jedno písmeno. Když například budete jako mít regulární výraz písmeno h, pak při hledání v textu to najde právě písmeno h. Zkuste si třeba spustit výše uvedený tester regulárních výrazů, do kolonky regulární výraz zadejte písmeno h a do kolonky text zadejte nějaký text. Pokud text bude obsahovat alespoň jedno písmeno h, třeba slovo ahoj, pak se po kliknutí na tlačítko objeví věta: "Regulárnímu výrazu vyhovuje: h". Pokud text nebude obsahovat písmeno h, pak se po kliknutí objeví věta: "Text nevyhovuje regulárnímu výrazu".
Najít písmeno h, nebo jiné písmeno v textu je ale tak jednoduchá úloha, že zkusíme postoupit kousek dál. Můžete také hledat celé slovo. Pokud například jako regulární výraz zadáte více písmen, třeba slovo ahoj, bude se hledat v textu celé slovo ahoj. Vyhledávání slov je vlastně velmi jednoduchou, ale zároveň často používanou aplikací regulárních výrazů.
Funkce ereg - testování regulárních výrazů
Pro testování regulárních výrazů slouží v PHP funkce ereg. Funkce má 2, nebo 3 parametry, teď ukážeme verzi se dvěma parametry:
ereg (regulární výraz, text)
Jako první parametr se dává regulární výraz, jako druhý parametr testovaný text. Funkce vrací hodnotu, která říká, jestli text vyhovuje regulárnímu výrazu. Příklad použití funkce ereg ukáži na příkladě, který otestuje, zda je správně zadána e-mailová adresa. Kontrolu e-mailové adresy uděláme jako formulář (viz 10. díl seriálu), tedy roztažený do dvou souborů. První soubor uložte s názvem zadani.php. Nebudete to vlastně ani PHP skript, jen čistý HTML soubor sloužící pro zadání e-mailové adresy:
<html>
<head>
<title>Příklad 2. z 16. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<form action="kontrola.php" method="post">
<b>Zadej e-mailovou adresu:</b>
<input type="text" name="mail" value="">
<br>
<input type="submit" value="Otestuj e-mailovou adresu">
<br>
</form>
</body>
</html>
Druhý soubor uložte s názvem kontrola.php:
<html>
<head>
<title>Příklad 3. z 16. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
$mail = $_POST[`mail`];
if (ereg(`@`, $mail))
echo `E-mailová adresa je správně`;
else
echo `E-mailová adresa není správně`;
?>
<br><br>
<a href="zadani.php">Zkontrolovat další mail</a>
</body>
</html>
Příklad si spustíte tak, že nastartujete zadani.php a zadáte nějaký mail, ať už správný, nebo chybný. Po kliknutí na tlačítko "Otestuj e-mailovou adresu" zjistíte, jestli je e-mailová adresa správně.
A jak to pracuje? Velmi jednoduše. V souboru zadani.php je pouze zadání e-mailové adresy, která se po kliknutí na tlačítko přenese do PHP skriptu kontrola.php. Tam se vyzvedne a zkontroluje funkcí ereg. Jako regulární výraz je použit zavináč `@`, takže se vlastně kontroluje, zda je v textu znak zavináč. Pokud tam je, e-mailová adresa se považuje za správnou. Pokud tam není, považuje se e-mail za nesprávný.
Takže zde vidíte využití i velmi jednoduchého regulární výrazu. Je jasné, že kontrola správnosti e-mailové adresy jen podle přítomnosti znaku zavináč není ještě to pravé ořechové. Ale postupně kontrolu e-mailové adresy zpřesníme.
Složitější regulární výrazy - trocha teorie
Pro hledání v textu často potřebujeme složitější věci, než jenom vyhledání písmena, nebo slova. Nažhavte proto znovu tester regulárních výrazů z prvního příkladu a půjdeme dále.
V regulárních výrazech slouží tečka k hledání libovolného znaku. Je to speciální znak, například tento regulární výraz:
.ost
najde slovo kost, post, most, dost a další slova, je prostě jedno, co je na prvním místě za písmeno, nebo za znak. Vyzkoušejte si to v testeru regulárních výrazů.
Někdy ale chceme, aby to nebylo až tak jedno. Pak můžeme použít hranaté závorky [] a vyjmenovat do nich znaky, které chceme dovolit. Například tento regulární výraz najde pouze slova most a kost:
[mk]ost
Výše uvedený regulární výraz je potřeba číst tak, že najde čtyřpísmenné slovo, kde na prvním místě je buď písmeno m, nebo k a zbylá tři písmena jsou ost.
V hranatých závorkách [] se ale můžeme rozšoupnout trochu více. Pokud třeba chceme najít dvoumístnou číslici, můžeme to pomocí regulárního výrazu napsat takto:
[123456789][01234567890]
Tím říkám, že hledám dva znaky, přičemž první je číslice z rozsahu 1 až 9, druhý znak je číslice z rozsahu 0 až 9. Tak najdu dvoumístnou číslici. Tento regulární výraz je možné napsat i kratším způsobem, a to použitím pomlčky:
[1-9][0-9]
Pomlčka slouží k uvedení rozsahu znaků, v mém případě na prvním místě znak z rozsahu 1 až 9, na druhém místě hledám znak z rozsahu 0 až 9.
Pokud za levou hranatou závorkou [ použiji znak ^, pak se význam obrací. Hledám znaky, které nejsou uvedeny v hranatých závorkách. Například následujícím regulárním výrazem hledám znak, který není číslicí 0 až 9:
[^0-9]
Jako složitější příklad si v testeru regulárních výrazů můžete zkusit vyhledat datum třeba ve formátu 31/12/2003, nebo 01-04-2003. Vyhledání takového data lze podle jednoduchého regulárního výrazu (předpokládám, že dni i měsíce mají pokaždé dvě číslice):
[0-3][0-9].[01][0-9].[12][0-9][0-9][0-9]
Tento díl je úvodem do regulárních výrazů, příští díl seriálu bude v regulárních výrazech pokračovat.