Úvod HTML CSS PHP MySQL JavaScript
Regulární výrazy

Regulární výrazy

Regulární výrazy jsou speciální textové řetězce, které popisují určitou "masku", které má odpovídat určitý textový řetězec.

Syntaxe Perl-compatible.

Prvním a opticky nejpodstatnějším rozdílem oproti standardu POSIX je potřeba uzavřít celý výraz mezi oddělovače. Oddělovačem může být libovolný znak vyjma alfanumerických znaků, bílých znaků a zpětného lomítka. Často se používají znaky jako '/', '#', '~', apod. Místo 'výraz' budeme tedy psát '#výraz#', '/výraz/' nebo třeba '%výraz%'. Znak oddělovače nesmí být použit uvnitř výrazu. Pokud bychom ho přesto potřebovali do výrazu zařadit, musíme před něj přidat znak zpětného lomítka.

Metaznak Znamená Výraz: Vyhoví Nevyhoví
^
Začátek řetězce
^Petr Petr je borec
Petr není borec
Borec je Petr
Franta a Petr jsou borci
$
Konec řetězce
PC$
Mám PC
Pracuji na PC
Moje PC je rozbité
PC má dnes každý
\b
Hranice slova
^a\b.+\bz$
a bbb z
a z
s bbb z
.
Libovolný znak
s.x
sex
six
tix
sad
*
Výraz před tímto metaznakem může mít libovolný počet opakování (i nulakrát)
s*t
prst
půst
prut
prase
+
Výraz před tímto metaznakem se musí vyskytnout alespoň 1x
s+t
prst
srst
prut
?
Výraz před tímto metaznakem se může opakovat 0x nejvýše 1x s?t
prejt
prst
síť
psst
[]
Libovolný znak ze znaků v závorce
[0123456789]
12
356
8 kusů
kusy
kila
litry
()
Všechny znaky ze znaků v závorce
(obec)
obecný
obecní
všeobecný
věcný
jablečný
všeobjímající
|
Rozdělení na podvýrazy
Astronaut|Babička
Astronaut
Babička
edém
čistě
\
Následující metaznak bude chápán jako znak
\+
Vše, co obsahuje "+"
Co neobsahuje "+"
{n}
Právě nkrát
ab{4}c
abbbbc
abbc
{m,n}
Minimálně mkrát, maximálně nkrát ab{2,4}c
abbbbc
abbc
abc
abbbbbbc
{m,}
Minimálně mkrát ab{2,}c
abbbbc
abbc
abc
abxc
[1-5] pomlčka určuje rozah 1 až 5, [a-z] určuje rozsah a až z (tedy celou abecedu)
[^1-5] negace výrazu, vyhoví jen řetězce, které neobsahují uvedený znak či rozsah

Pro často používané množiny znaků existují předdefinované zkratky:
Zkratka Ekvivalentní zápis
Popis Příklad
\d [0-9] číslice desítkové soustavy a\db odpovídá a2b, ale ne axb
\D [^0-9] cokoli kromě číslic desítkové soustavy a\Db odpovídá axb, ale ne a2b
\w
[0-9a-zA-Z_] odpovídá alfanumerickému znaku a podtržitku
\w odpovídá 1, a, A, _ , ale ne $, +
\W [^0-9a-zA-Z_] odpovídá nealfanumerickému znaku nebo podtržítku
\W odpovídá $, !, ?, % , ale ne 2, b
\s
[ \n\r\t\f]
odpovídá bílému znaku (\n, \r, \t, mezera aj.)
a\sb odpovídá a b, ale ne ab
\S [^ \n\r\t\f] odpovídá jinému než bílému znaku a\Sb odpovídá a+b, ale ne
a b
\h [ ] horizontální bílé znaky (např. mezera, tabulátor) a\hb odpovídá a b, ale ne
a+b
\H [^ ] vše kromě horizontálních bílých znaků a\Hb odpovídá a*b, ale ne
a b
Netisknutelné znaky ve výrazech:
Zkratka Význam
\n zalomení řádku
\t tabulátor
\e znak escape
\r návrat vozíku
\f zalomení stránky
Modifikátory
modifikátor význam
i při vyhodnocování se nebude rozlišovat mezi malými a velkými písmeny
x bílé znaky a komentáře (znaky vpravo od #) jsou ignorovány
Seznam modifikátorů se uvádí za samotný výraz (proto je také výraz uzavřen mezi oddělovače, aby bylo jasné, kde končí výraz a začínají modifikátory) - #výraz#modifikátory

Funkce využívající regulární výrazy

preg_match($výraz,$řetězec)

Funkce najde první shodu regulárního výrazu $vyraz s řetězcem $retezec.
Funkce vrací 1 je pravda nebo 0 není pravda.
    $retezec="5 raket";
    $vyraz=  '/\d+/';                  //  \d číslice desítkové soustavy 
     
    if (preg_match($vyraz, $retezec))
    echo $retezec."-pravda"; 
    else echo $retezec."-nepravda";
    

preg_match($výraz,$řetězec,$pole)

Pokud je funkci předána reference na $pole, jsou do tohoto pole uloženy části řetězce, které odpovídají jednotlivým subvýrazům regulárního výrazu. Pod indexem 0 je v poli uložena shoda s celým regulárním výrazem. V poli 1 je uložen řetězec odpovídající subvýrazu (samozřejme jen pokud regulární výraz má subvýrazy).
    $retezec="54 raket";
    $vyraz=  '/(13|26|54) raket/';                
    preg_match($vyraz, $retezec,$pole);
    print_r($pole);
    

preg_match_all($výraz,$řetězec,$pole)

Funkce najde všechny shody regulárního výrazu $vyraz s řetězcem $retezec. Funkce vrací počet nalezených výskytů a $pole ,které obsahuje všechny nalezené výskyty.
   $retezec="13raket 10raket 33raket 54raket";
   $vyraz=  '/(33|13|54)raket/';
   $pocet= preg_match_all($vyraz,$retezec,$pole);
   echo $pocet." ";
   print_r($pole) ;
        

preg_replace($vyraz, $nahrada, $retezec)

Funkce hledá shodu regulárního výrazu $vyraz s řetězcem $řetězec. Pokud je shoda nalezena, část řetězce odpovídající regulárnímu výrazu je nahrazena řetězcem $nahrada.
   $retezec="ahoj lidi Ahoj všici";
   $nahrada ="Čau";
   $vyraz=  '/[aA]hoj/'   ;   
   $novyretezec= preg_replace($vyraz,$nahrada,$retezec);
   echo $novyretezec;
      
     

preg_replace_callback($vyraz,"nahrada", $retezec)

Funkce provádí náhradu řetězců odpovídajících regulárnímu výrazu podobně jako funkce preg_replace().
U preg_replace_callback() je však jako náhrada použita návratová hodnota uživatelsky definované funkce
"nahrada" , které je na vstupu předán řetězec $retezec odpovídající regulárnímu výrazu $vyraz .
Tato funkce nic nevrací, ale vypíše řetězec odpovídající výrazu.
  function nahrada($text){
  print( "$text[0]<br>") ;
  return  ;
    }
  $vyraz = '/([Rr]eg)+[^ .]+/';
  $retezec = 'Regulérní použití regulárních výrazů pro registraci regimentu.';
  preg_replace_callback($vyraz, "nahrada", $retezec);
     
     
Ještě jeden příklad na zaokrouhlování:
 
  function zaokrouhli($cislo)
  {
  $cislo=$cislo[0];
  if(preg_match("@[5-9]$@",$cislo) )
  $cislo= $cislo+10;
  $result= preg_replace("@[0-9]$@","0",$cislo) ;
  return $result;
  };

  $vyraz="/\d{2}/";
  $function_name="zaokrouhli"; //název uživatelské funkce
  $retezec="12, 91, 45, 29, 30, 01";
  echo preg_replace_callback($vyraz,$function_name,$retezec); 
     
 

preg_split($vyraz, $retezec)

Funkce dostane oddělovač $vyraz a podle něj rozdělí vstupní řetězec $retezec na pole podřetězců:
  $retezec = 'Kdo tam je?';
  $slovo = preg_split('/[ ]+/', $retezec);
  echo $slovo[0];
  echo "<br>";     // 'Kdo'   
  echo $slovo[1];
  echo "<br>";      // 'tam'     
  echo $slovo[2];      // 'je?'      

 

preg_grep($vyraz,$retezec)

Funkce načte pole řetězců $retezec a vratí nové pole obsahující pouze ty řetězce, které odpovídají regulárnímu výrazu $vyraz. Příklad dvou způsobů výpisu:
  $pole=["h12","45","51","hjg","gfgfgf","123"] ;
  $pole1 = preg_grep("/^(\d+)/", $pole);
  foreach( $pole1 as $tisk )
  echo $tisk."<br>";
  print_r($pole1); 
 

Podrobný popis je např. zde

pravy Ascii tabulka
Barvy
Klávesové zkratky


©2013-2021 Trojklik.8u.cz Autor: Vašek D.