![]() |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
|
Metaznak | Ekvivalent |
+ | {1,} |
* | {0,} |
? | {0,1} |
Ukažme si nyní program, který ověřuje bezpečnost hesla. Heslo budeme považovat za bezpečné, bude-li splňovat tyto 4 podmínky:
Pro každou podmínku napíšeme regulární výraz a pokud vyhoví heslo všem těmto vzorům, máme jistotu, že je heslo bezpečné.
print "Zadejte heslo: ";
chomp($_ = <STDIN>);
if (/[0-9]/ and /[a-zA-Z]/ and /\W/ and /.{6,}/){
print "Heslo je bezpečné\n";
}else{
print "Heslo není bezpečné\n";
}
Poznámka - pokud byste chtěli, aby při zadávání hesla nezobrazovaly jeho pravé znaky, ale pouze hvězdičky (případně vůbec nic), použijte modul Term::ReadKey.
Metaznaky {}, *, + a ? jsou takzvaně hladové (,,greedy"). To znamená, že spolknou co možná nejdelší část řetězce. Dokazuje to tento kód:
$_ = "123456789";
/(\d*)/;
print $1; #tiskne hodnotu, která vyhověla vzoru - více v příštím díle
Je vytisknuto 123456789 - tedy celý řetězec. To i přesto, že by vyhověl třeba také prázdný řetězec, vyhodnocování regulárního výrazu by se mohlo úspěšně ukončit a program by běžel dál. Kvantifikátory jsou hladové, a tak pohlcují nejdelší vyhovující podřetězec. To samé by platilo i v případě, kdybychom jako kvantifikátor místo hvězdičky zvolili například {3,5}. Potom by předchozí kód vytiskl prvních 5 číslic a ne 3, ačkoliv by to také stačilo.
Tato vlastnost může občas činit problémy. Tak například, pokud chceme v HTML kódu vyhledat 1 obrázek a vypsat kód celé značky IMG:
$html = 'abc....<IMG SRC="obrazek" ALT="obrázek">....xyz';
$html =~ /(<((IMG)|(img))\ (.*)>)/;
print $1;
Hvězdička vlivem hladovosti spolkne znaky do konce řetězce. Ale tam v našem případě znak > není. Proto se začne z místa, po které hvězdička spolkla text (v našem případě konec řetězce) hledat. Najde ho, ukončí další vyhodnocování, protože je na konci regulárního výrazu a program vytiskne přesně to, co jsme chtěli. Takže v pořádku. Problém nastane, pokud se znak > vyskytuje ještě někde mezi místem, po které byl spolknut text a tím "správným" znakem >. To si můžeme jednoduše ilustrovat:
$html = '<TABLE><TR><TD><IMG SRC="obrazek" ALT="obrázek"></TD><TD>...</TD></TR></TABLE>';
$html =~ /(<((IMG)|(img))\ (.*)>)/;
print $1;
Začátek je stejný jako v minulém příkladu. Hledá se řetězec "<IMG ", poté hvězdička pohltí vše do konce a odtud se opačným směrem hledá znak >. Ale takový se vyskytne už v značce </TABLE>! To znamená, že získáme řetězec <IMG SRC="obrazek" ALT="obrázek"></TD></TR><TD>...</TD></TABLE>. To jsme opravdu nechtěli. A může za to právě hladovost.
Možnost, jak vzniklý problém řešit, může být přes funkce. To je zbytečně složité.
$html = '<TABLE><TR><TD><IMG SRC="obrazek" ALT="obrázek"></TD><TD>...</TD></TR></TABLE>';
$html =~ /(<((IMG)|(img))\ (.*)>)/;
print substr($1, 0, (index $1, ">")+1);
Jiné, o dost lepší řešení, lze aplikovat pomocí negované množiny znaků. Místo libovolného znaku (v našem regulárním výrazu reprezentován tečkou), specifikujeme vše mimo znaku >.
$html = '<TABLE><TR><TD><IMG SRC="obrazek" ALT="obrázek"></TD><TD>...</TD></TR></TABLE>';
$html =~ /(<((IMG)|(img))\ ([^>]*)>)/;
print $1;
Dalším řešení nabízí sytost. Existují další 4 kvantifikátory, které fungují úplně stejně jako ty nám dosud známé, až na to, že nejsou hladové. Jsou to {}?, *?, +? a ??. Zapisují se stejné jako {}, *, + a ?, jen se za ně připisuje otazník. Pohltí minimální možný počet znaků, který vyhoví vzoru. Tento vzor tedy nepohltí 5 znaků, jak by to udělal hladový kvantifikátor, ale pouze 3:
$_ = "123456789";
/(\d{3,5}?)/;
print $1;
Nakonec si ještě ukážeme řešení pro problém s vyhledáním obrázku v HTML kódu pomocí sytosti:
$html = '<TABLE><TR><TD><IMG SRC="obrazek" ALT="obrázek"></TD><TD>...</TD></TR></TABLE>';
$html =~ /(<((IMG)|(img))\ (.*?)>)/;
print $1;
Příště se podíváme na funkci kulatých závorek v regulárních výrazech.
|
||
KOMENTARZE
Nie ma komentarzy dla tej pozycji. |
||
Tylko zarejestrowani użytkownicy mogą dopisywać komentarze.
|
1. |
Pacman linux Download: 5096x |
2. |
FreeBSD Download: 9311x |
3. |
PCLinuxOS-2010 Download: 8800x |
4. |
alcolix Download: 11190x |
5. |
Onebase Linux Download: 9910x |
6. |
Novell Linux Desktop Download: 0x |
7. |
KateOS Download: 6459x |
1. |
xinetd Download: 2623x |
2. |
RDGS Download: 937x |
3. |
spkg Download: 5247x |
4. |
LinPacker Download: 10393x |
5. |
VFU File Manager Download: 3396x |
6. |
LeftHand Mała Księgowość Download: 7484x |
7. |
MISU pyFotoResize Download: 3090x |
8. |
Lefthand CRM Download: 3760x |
9. |
MetadataExtractor Download: 0x |
10. |
RCP100 Download: 3373x |
11. |
Predaj softveru Download: 0x |
12. |
MSH Free Autoresponder Download: 0x |