Tato aplikace bude (skoro) všechny tyto metody (nevyužijeme pouze
nejjednodušší dvě metody search()
a test()
)
používat při práci s řetězci a regulárními výrazy…
Co bude naše aplikace umět?
match()
)replace()
)split()
)exec()
)Vyzkoušejte si nejdříve hotovou
aplikaci (zdrojový
kód). Jak vidíte, aplikace obsahuje šest textových vstupních polí
(regvyraz
, modifikatory
, oddelovac
,
nahrada
, vstup
, vystup
). Ne všechna pole
musí být vždy vyplněna – vždy záleží jakou akci (Match, Replace,
Split, Exec) budeme chtít provádět. Podívejme se na jednotlivá pole:
vstup
obsahuje vstupní text (text, který chcemevystup
obsahuje text, který příslušná funkceregvyraz
obsahuje regulární výraz zapsaný bez/
) a modifikátorů.modifikatory
obsahuje řetězec složený z písmeng
, gi
aoddelovac
je použito pouze při akci Match nebo Split anahrada
je použito jen při akci Replace a obsahujeCelá aplikace pracuje na velmi jednoduchém principu. Každé
z tlačítek (akcí) spustí jednu ze čtyř uživatelsky definovaných
funkcí (f_match()
, f_replace()
,
f_split()
, f_exec()
). Každá funkce načte
z polí formuláře vstupy, které použije jako argument příslušné
funkce (metody) postavené na regulárních výrazech (match()
,
replace()
, split()
, exec()
).
U metod, které vrací pole (match()
, split()
,
exec()
), je návratová hodnota převedena na řetězec pomocí
funkce join()
(u akcí Match a Split) nebo pomocí
procházení pole v cyklu a „ručního“ zřetězení prvků
pole (u akce Exec).
Zdrojový kód stránky s formulářem bude vypadat následovně:
<body>
<h1>Javascript RegExp All-in-1 Tool</h1>
<form id=„reapp“ name=„reapp“ action=““
onsubmit=„return false;“>
<table>
<tr>
<td class=„popis“>Regulární
výraz</td>
<td><input class=„txtinput“
type=„text“ name=„regvyraz“ /></td>
</tr>
<tr>
<td
class=„popis“>Modifikátory</td>
<td><input class=„txtinput“
type=„text“ name=„modifikatory“ /></td>
</tr>
<tr>
<td
class=„popis“>Oddělovač</td>
<td><input class=„txtinput“
type=„text“ name=„oddelovac“ /></td>
</tr>
<tr>
<td
class=„popis“>Náhrada</td>
<td><input class=„txtinput“
type=„text“ name=„nahrada“ /></td>
</tr>
<tr>
<td
class=„popis“>Vstup</td>
<td><textarea name=„vstup“
cols=„60“ rows=„20“>
</textarea></td>
</tr>
<tr>
<td
class=„popis“>Výstup</td>
<td><textarea name=„vystup“
cols=„60“ rows=„20“>
</textarea></td>
</tr>
<tr>
<td
class=„popis“>Akce</td>
<td>
<input value=„Match“
type=„submit“ >
<input value=„Replace“
type=„submit“ >
<input value=„Split“
type=„submit“ >
<input value=„Exec“
type=„submit“ >
</td>
</tr>
</table>
</form>
</body>
</html>
Ve výše uvedeném kódu jsou u některých elementů uvedeny CSS
třídy odpovídající externí definici stylů, stylování stránky se však
v tomto článku věnovat nebudeme. Výše uvedený zdrojový kód stránky
neobsahuje vlastní javascriptové funkce – na ty se podíváme
samostatně níže. V kódu stojí za pozornost ještě zápis
<form id=„reapp“ name=„reapp“ action-xhr="#" onsubmit=„return false;“>
,
respektive především akce
onsubmit=„return false;“
, která zajistí,
že kliknutí na tlačítka Match, Replace, Split či Exec (což jsou
input
prvky typu submit
) nezpůsobí odeslání
formuláře.
f_match()
Funkce f_match()
je jednoduchá a snad by ani žádný
komentář nevyžadovala. Přesto, pár slov se na tomto místě sluší.
Vstupní text (řetězec, načtený z formuláře) si uložíme do
proměnné vstup1
, poté vytvoříme instanci objektu
RegExp
– regvyraz1
. Takto vzniklé proměnné
použijeme pro metodu match()
. Pole result
, které
metoda match()
vrátí, převedeme pomocí metody
join()
na řetězec, který zobrazíme v prvku
textarea
.
f_replace()
Funkce f_replace()
je velmi podobná. Dokonce je ještě
jednodušší, protože metoda replace()
vrátí přímo řetězec,
který se zobrazí v textarea
.
f_split()
Funkce f_split()
má analogickou strukturu jako
f_replace()
. Jediný (ale podstatný) rozdíl je v tom, že
regulární výraz popisuje řetězec, pomocí nějž se má vstupní text
(řetězec) rozdělit na části. Takto vzniklé části (pole řetězců) se
opět převedou s použitím metody join()
na výstupní
řetězec.
f_exec()
Kód funkce f_exec()
je velmi podobný kódu příkladu
(u metody exec()
) v předcházejícím článku. Tato
funkce je přeci jen o něco složitější než tři předcházející,
proto doporučuji si nejdříve vyzkoušet při jakých vstupech (regulární
výraz, modifikátory, vstupní text) vrací jaký výstup (respektive
především jak je výstup formátován).
Funkce je postavena na dvou vnořených cyklech. Vnější while
cyklus slouží k opakovanému volání metody exec()
při
globálním prohledávání (počet průchodů cyklem zaznamenává počítadlo
i
). Vnořený cyklus for
slouží k procházení
shod s jednotlivými subvýrazy, tedy de facto pro procházení pole,
které vrátí metoda exec()
(počet průchodů tímto cyklem
zaznamenává počítadlo j
). V cyklu while
voláme opakovaně result1=regvyraz1.exec(vstup1)
.
Navrácené pole result1
procházíme ve for
cyklu a
do řetězcové proměnné subvyrazy
vždy zapíšeme (respektive
připíšeme) shodu ve tvaru
[i][j]: shoda
, kde
i udává o kolikátou shodu (při globálním
vyhledávání) se jedná (indexováno od nuly!) a j udává,
o shodu s kolikátým subvýrazem se jedná (shoda s celým
regulárním výrazem je pod indexem 0
).
Určitá komplikace nastává v případě, že nepoužijeme
modifikátor g
(globální vyhledávání). V takovém
případě je vždy vyhledáváno od začátku řetězce. Podmínka
while
je tedy splněna vždy, pokud je v řetězci alespoň
jedna shoda. Cyklus se tak stane nekonečnou smyčkou. V našem
jednoduchém kódu si dovolím pro řešení použít programátorsky ne zcela
nejčistší řešení, a to opuštění while
cyklu pomocí
break
na základě otestování vlastnosti global
regulárního výrazu. Zápis
if(!regvyraz1.global) break;
tedy říká: Pokud
regulární výraz neobsahuje modifikátor pro globální vyhledávání, opusť
cyklus.
Nastíněné řešení je pouze jádrem uživatelsky komfortní aplikace.
Není však již velkým problémem například místo textového vstupního
pole pro regulární výraz použít rozbalovací menu s přednastavenými
regulárními výrazy a podobně, a tak zpřístupnit funkčnost
i uživatelům, kteří se tolik s regulárními výrazy
nekamarádí.
Jak se zbavit (not set) v Session Source a Session Medium?
Chcete doměřit efekt vaší offline reklamy, ze které vedete lidi na váš web? Jde to…
Tenhle článek jsem měl rozepsaný fakt dlouho, ale je stále aktuální… Trápí mě, že opakovaně…
Poslední dobou jsem se setkal s pár majiteli malých firem, kteří mají web a snaží…
Občas se mě někdo ptá, co používám pro tvorbu screencastů a online videí. Které nástroje…
V rámci 5 videí najdete 7 krátkých video tipů pro zefektivnění práce s Google Analytics…