Dvojí Form::REGEXP na jednom prvku asi nefunguje jak má

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
medhi
Generous Backer | 255
+
0
-

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
+
0
-

Form::PATTERN na rozdíl od REGEXP obsahuje wrapper, tzn místo \x01foox01 jde psát foohttps://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
+
0
-
  • 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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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é.

David Grudl
Nette Core | 8228
+
0
-

Aha, to jsem nepostřehl. Tak to je spíš bug ve formulářích.

dakota
Člen | 148
+
0
-

David Grudl napsal(a):

Aha, to jsem nepostřehl. Tak to je spíš bug ve formulářích.

Bug v Form::PATTERN alebo bug v Form::REGEXP? Podľa mňa viacnásobné použitie by nemalo byť možné.

Editoval dakota (2. 2. 2011 21:40)

medhi
Generous Backer | 255
+
0
-

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
+
0
-

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
+
0
-

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.