Nejvýstiženější regulérní výrazivo (regexp)
- Václav Novotný
- Člen | 13
Vzhledem k nápaditosti nette mě překvapilo, že neobsahuje constanty pro nejčastěji používané regulérní výrazy u třídy forms. Tak jsem si říkal, že se podělím o výrazy, které jsem zatím vymyslel k validování pravidlem PATTERN a třeba se nám společnými silami podaří dospět k univerzálním výrazům, které by i po podrobení přísné kritice snesly začlenění do nette. Ostatně, asi nejsem sám, kdo se snaží vybrousit nějaký ten skutečně dokonalý regulérní výraz pro univerzální a jednoduché použití. Tak tedy:
phone:
'(\+?\(?((?:\d[\s\)]*){3})?(?:\d[\s\-]*){9})'
akceptuje žádnou nebo jednu tříčíselnou předvolbu, s plusem nebo závorkami, za kterou následuje devět čísel, mezi kterými můžou být mezery a pomlčky. Sice nejde zapsat složitější čísla s klapkou apod. ale na většinu kontaktních formulářů by to mělo být OK.
mail:
'([\w\.\-]+@[\w\-]+\.[a-zA-Z]{2,3})'
pokud předpokládáme, že zprávy nechodí z intranetu a že člověk nenapíše do doménového jména IP adresu, a zároveň že nepoužívá normou povolené zvláštní znaky, které se ale běžně nevyskytují a dokonce je některé mailservery neakceptují, pak tento filtr by měl uspokojit snad každého.
name:
'(((?!\d)[\S]){2,}\s+\D{2,})'
abychom přijali veškerou diakritiku, vezmeme pro začátek cokoliv kromě mezery, čísla a musí to být alespoň rovno 2 a poté může následovat cokoliv kromě čísla, co je delší než dva.
A ještě jeden užitečný poznatek. Pokud chceme udělat negaci
regulérního výrazu, například při podmínce addConditionOn
v případě „když neobsahuje“, tak vezmeme výraz „když obsahuje“ a
a dáme před něj
(?!.*
a za něj
).*
- Pavel Macháň
- Člen | 282
Václav Novotný napsal(a):
Vzhledem k nápaditosti nette mě překvapilo, že neobsahuje constanty pro nejčastěji používané regulérní výrazy u třídy forms. Tak jsem si říkal, že se podělím o výrazy, které jsem zatím vymyslel k validování pravidlem PATTERN a třeba se nám společnými silami podaří dospět k univerzálním výrazům, které by i po podrobení přísné kritice snesly začlenění do nette. Ostatně, asi nejsem sám, kdo se snaží vybrousit nějaký ten skutečně dokonalý regulérní výraz pro univerzální a jednoduché použití. Tak tedy:
.....mail:
'([\w\.\-]+@[\w\-]+\.[a-zA-Z]{2,3})'
pokud předpokládáme, že zprávy nechodí z intranetu a že člověk nenapíše do doménového jména IP adresu, a zároveň že nepoužívá normou povolené zvláštní znaky, které se ale běžně nevyskytují a dokonce je některé mailservery neakceptují, pak tento filtr by měl uspokojit snad každého.
......
Form::EMAIL – validace
Editoval EIFEL (15. 1. 2014 22:34)
- Václav Novotný
- Člen | 13
EIFEL napsal(a):
Form::EMAIL – validace
Ostatně to lze vyřešit elegantně nastavením typu pole na email a tím se u mobilních zařízení správně nastaví i dotyková klávesnice. Já jsem vytvářel regulérní výraz kvůli tomu, že mám pole, které akceptuje jak telefón, tak email, prostě kterýkoliv z těchto dvou kontaktů a na to nelze pravidlo form::email použít. Ale jinak správná připomínka!
Editoval Václav Novotný (15. 1. 2014 23:07)
- Václav Novotný
- Člen | 13
Mysteria napsal(a):
@Václav Novotný: Neměl by jsi něco na IP adresu? Regulérní výrazy mi nic moc neříkají a ty nalezené na internetu mi pod PATTERN pravidle v Nette nechtějí fungovat. :( Byl bych ti moc vděčný. Díky.
Na IP adresu zatím nic nemám ale takhle z rychlíku by mělo fungovat třeba něco takového na IPv4
'(?:[12]?\d{1,2}\.){3}[12]?\d{1,2}'
tedy tři bloky končící tečkou a každý může, ale nemusí začínat
jedničkou nebo dvojkou (pro trojmístná čísla) a následuje libovolné
číslo \d = [0-9]
jednou nebo dvakrát. Poslední blok je stejný,
akorát nekončí tečkou.
Kdyby jsi chtěl IPv6, tak to už je vyšší dívčí, ale určitě by mělo fungovat
'(?:(\d|[a-fA-F]){0,4}:){2,7}(\d|[a-fA-F]){1,4}'
nejdřív se definuje blok, mající 0–4 hexadecimální čísla a je zakončen dvojtečkou. Tento blok musí být alespoň dvakrát a maximálně sedmkrát. Na konci musí být stejný (osmý) blok, mající alespoň jedno číslo na konci bez dvojtečky.
Kdyby jsi chtěl do pole zadávat obě verze IP, respektive kteroukoliv z nich, tak jednotlivé PATTERN obalíš do kulatých závorek, dáš mezi ně svislítko a nakonec to celé zase obalíš kulatými závorkami.
Pozor na chování nette, které automaticky doplňuje znak ^
na
začátek a $
na konec PATTERN, takže pole musí
regulérním výrazem začínat a končit, jinými slovy nesmí obsahovat nic
jiného, než regulérní výraz.
Nette taky automaticky doplňuje lomítko /
na začátek a konec
výrazu, čímž se normálně uvozuje regulérní exprese. Pokud budeš pattern
používat jinde, než v nette form::PATTERN, nezapomeň výraz obalit
ještě do těchto lomítek, jinak ti ho PHP nevezme.
Jinak k testování regulérních výrazů používám regexpal.
Editoval Václav Novotný (16. 1. 2014 8:24)
- Milo
- Nette Core | 1283
V Nette žádný list „nejčastěji používaných“ regulárů není. Třeba pro to, že například pod pojmem telefonní číslo si představí každý něco jiného.
Pokud chcete Nette přispět, vytvořte si extension. Věřím, že jakmile začne být masivně používaná, klidně se může do Nette mergnout.
A nediskutujte tu, prosím, správnost regulárů. Má se tu diskutovat o Nette.
Editoval Milo (16. 1. 2014 10:16)