Dvojí Form::REGEXP na jednom prvku asi nefunguje jak má
- medhi
- Generous Backer | 255
Zdravím,
chci na jednom textovém políčku nastavit 2 REGEXPy, protože potřebuji
2 různé hlášky. Chci, aby tato pravidla byla spojená jako
AND
, bohužel to tak nefunguje. Můj kód vypadá takto:
$platceData->addText('jmeno', "Jméno\xc2\xa0a\xc2\xa0příjmení:", 20)
->addConditionOn($form['platce'], Form::EQUAL, 0)
->addRule(Form::FILLED, 'Vyplňte prosím jméno a příjmení')
->addRule(Form::REGEXP, 'Vyplňte prosím jméno a příjmení', '/.{2,}\s.{2,}.*/') // aby řetězec měl alespoň 2 slova
->addRule(Form::REGEXP, 'Jméno a příjmení může obsahovat pouze písmena a tečky', '/[a-zA-ZěščřžýáíéďťňúůĚŠČŘŽÝÁÍÉĎŤŇÚŮ .]+/');
Řetězec Karel ---
těmito pravidly projde. Očekával bych
hlášku Jméno a příjmení může obsahovat pouze písmena a tečky
Zkoušel jsem na radu Vrtaka i navzájem to obalit podmínkami s REGEXPem, ale nepomohlo to.
Je to bug nebo správné chování? Jak na to? Děkuji
PHP 5.3 Nette 2.0 alpha2
BTW: Form::PATTERN nejde vůbec (?)
- Mikulas Dite
- Člen | 756
Form::PATTERN
na rozdíl od REGEXP
obsahuje
wrapper, tzn místo \x01foox01
jde psát foo
. https://api.nette.org/…ase.php.html#214
Ta pravidla vylepši o ^
a $
, což jsou začátek,
resp. konec stringu. Teď se Karel ---
matchne na
Karel
, ale s
^[a-zA-ZěščřžýáíéďťňúůĚŠČŘŽÝÁÍÉĎŤŇÚŮ .]+$
to neprojde. Btw ĚÝÁÍÉĎŤŇ
a asi některá další písmena
ve jméně určitě nebudou.
Edit: tzn. místo ^$
použí právě PATTERN
, ale
nepiš tam ten wrapper.
Editoval Mikulas Dite (27. 1. 2011 22:00)
- bojovyletoun
- Člen | 667
- Je pravda, že pattern je /vhodnejší/ pro javascript?
- tedy u REGEXP je reg výraz celý vstup, tatímco u PATTERN je to ~^$~u
Editoval bojovyletoun (27. 1. 2011 22:12)
- medhi
- Generous Backer | 255
Když použiju
->addRule(Form::PATTERN, 'Jméno a příjmení musí obsahovat pouze písmena', '[a-zA-ZěščřžýáíéďťňúůĚŠČŘŽÝÁÍÉĎŤŇÚŮ .]+')
, tak projde i -----
. Jakoby vůbec nefungoval.
Ovšem
->addRule(Form::REGEXP, 'Jméno a příjmení musí obsahovat pouze písmena', '/^[a-zA-ZěščřžýáíéďťňúůĚŠČŘŽÝÁÍÉĎŤŇÚŮ .]+$/');
funguje dokonale i s tím druhým a v této podobě to dělá přesně to co chci. Díky
Jinak tomu wrapperu moc nerozumím, proč zrovna tyto znaky?
\x01\x01
?
- dakota
- Člen | 148
Form::PATTERN – by mal byť kompatibilný s HTML5 – pridáva atribút
pattern="..."
pre HTML5 validáciu, týka sa vždy celého textu,
nie je nutné pri ňom písať delimitery na začiatku a konci regulárneho
výrazu a je tiež case sensitive.
$chars = 'a-zA-ZěščřžýáíéďťňúůĚŠČŘŽÝÁÍÉĎŤŇÚŮ.';
... ->addRule(Form::REGEXP, 'Vyplňte prosím jméno a příjmení', "/^[$chars]{2,}( [$chars]{2,})+$/u");
// alebo
... ->addRule(Form::PATTERN, 'Vyplňte prosím jméno a příjmení', "[$chars]{2,}( [$chars]{2,})+");
Z hľadiska návrhu je lepšie rozdeliť Jméno a příjmení
na dva samostatné prvky – aby bolo jasné čo je meno a čo priezvisko, je
to tiež využiteľné pri zotriedení napr. podľa priezviska.
Editoval dakota (28. 1. 2011 13:09)
- medhi
- Generous Backer | 255
dakota: Tento návrh je podle mě špatný v tom, že když někdo vyplní
Emil P!nkas
, tak mu to nahlásí
Vyplňte prosím jméno a příjmení
a on nebude vědět, že
problém je v tom, že nesmí psát vykřičník.
Návrh, kdy je příjmení zvlášť je určitě lepší, nicméně nejsem ve fázi návrhu aplikace, ale přepisu aplikace do Nette.
- dakota
- Člen | 148
Malo by fungovať:
...
->addRule(Form::REGEXP, 'Vyplňte prosím jméno a příjmení', '/^\S{2,}( \S{2,})+$/u')
->addRule(Form::REGEXP, 'Jméno a příjmení může obsahovat pouze písmena a tečky', '/^[a-zA-ZěščřžýáíéďťňúůĚŠČŘŽÝÁÍÉĎŤŇÚŮ .]+$/u');
Pri Jméno a příjmení
je potrebné podchytiť napr.
Ing. Mrkvička
to by prešlo pričom nie je zadané meno (napr.
kontrolovať zadanie titulu alebo nepovoliť zadanie .
).
Viacnásobné použitie:
- pri Form::REGEXP funguje
- pri Form::PATTERN by som to asi nedoporučoval kvoli atributu
pattern="..."
(aj ked v php to funguje) – ak sa Form::PATTERN má použiť iba raz, tak by to malo vyhodiť vynimku ‚Pattern has already been set (added).‘ alebo nastaviť nový pattern.
Bolo by dobré ak by v dokumentácii bolo uvedené aký zápis regulárneho výrazu je doporučený pri Form::REGEXP a Form::PATTERN, aby bol kompatibilný aj na strane javascriptu a HTML5.
Editoval dakota (28. 1. 2011 14:06)
- Patrik Votoček
- Člen | 2221
dakota napsal(a):
Bolo by dobré ak by v dokumentácii bolo uvedené aký zápis regulárneho výrazu je doporučený pri Form::REGEXP a Form::PATTERN, aby bol kompatibilný aj na strane javascriptu a HTML5.
Nejsem si jist jestli jsem správně pochopil otázku ale tohle by mohlo být jako odpověď https://github.com/…8cef48be9bd1#… dostačující.
- dakota
- Člen | 148
Patrik Votoček napsal(a):
Nejsem si jist jestli jsem správně pochopil otázku ale tohle by mohlo být jako odpověď https://github.com/…8cef48be9bd1#… dostačující.
Ako odpoveď chápem že Form::REGEXP je deprecated a bude nahradené pravidlom Form::PATTERN.
Ako kompatibilitu som myslel, že v dokumentácii nie je nikde uvedené, že v prípade Form::REGEXP treba používať regulárny výraz ktorý je podporovaný v javascripte, napr.:
- ako delimiter len
/
(v php je možný aj iný delimiter napr.#
,~
), netýka sa to Form::PATTERN, kde sa delimiter neuvádza - javascript nepodporuje napr. unicode triedu \p{vlastnosť} (v php Unicode character properties)
- iné rozdiely
V dokumentácii tiež nie je žiadny príklad na Form::REGEXP.
Editoval dakota (30. 1. 2011 12:59)
- David Grudl
- Nette Core | 8228
Form::PATTERN nahradí REGEXP, používejte proto pokud možno jen to první.
Pokud použijete REGEXP s českými znaky, nezapomeňte přidat modifikátor
u
, jinak to nebude na straně serveru fungovat.
- dakota
- Člen | 148
David Grudl napsal(a):
Form::PATTERN nahradí REGEXP, používejte proto pokud možno jen to první. Pokud použijete REGEXP s českými znaky, nezapomeňte přidat modifikátor
u
, jinak to nebude na straně serveru fungovat.
V prípade Form::REGEXP je možné jeho viacnásobné použitie na ten istý FormControl – ako je uvedené v tomto vlákne. V prípade Form::PATTERN to už asi nebude možné.
- medhi
- Generous Backer | 255
Form::PATTERN asi nikdy nebude odpovídat patternu v HTML 5 právě kvůli té vícenásobnosti. To, že jde u Nette formulářů použít vícenásobně REGEXP je super feature, protože můžete uživateli podávat různé hlášky podle toho co napíše a dovést ho rychleji ke správnému zadání.
Jak to bude nakonec vyřešeno se nechám překvapit, mám v Davida plnou důvěru.
V souvislosti s tímto bych se chtěl ještě zeptat, zda JS validace
podporuje modifikátory, pokud ano, tak všechny? Totiž například tento
REGEXP /^[0-9]{10}$/s
nepropustí řetězec
1234567890
, což by myslím měl. Modifikátor s
zkouším proto, protože nevím, jak jinak zamezit projití řetězce, který
má na začátku newline nebo jiný neviditelný znak, tímto regexpem.
Poradíte?
Děkuji
- Mikulas Dite
- Člen | 756
Vzhledem k tomu, že nette automaticky input trimuje, nemělo by to být potřeba řešit. https://api.nette.org/…put.php.html#44
- David Grudl
- Nette Core | 8228
JavaScript modifikátor s
nezná, ale ve výrazu /^[0-9]{10}$/
nemá
stejně naprosto žádný význam, protože ovlivňuje chování tečky. Výraz
/^[0-9]{10}$/s
řetězec 1234567890 samozřejmě propustí, jen na
straně JS k žádné validaci nedošlo kvůli použití neplatného
modifikátoru.