Form::REGEXP: různá chování v serverové a JS validaci + špatné chování v JS validaci

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

Ahoj, dlouho jsem sestrojoval regulární výraz, který nedovolí dvě lomítka za sebou v řetězci a zároveň v tomto řetězci nesmí být žádné zpětné lomítko.

Funguje dobře například na http://www.regexp.cz/ když ho testuji pomocí PHP preg a kde má tuto podobu:

^(?:[^\\](?<!\/\/))+$

Ovšem ve formulářích Nette 2.0 alpha2 s použitím Form::REGEXP nefunguje. Pokud však vypnu JS a přidám další dvě zpětná lomítka do části [^\\], tedy

^(?:[^\\\\](?<!\/\/))+$

tak tento výraz funguje v serverové validaci. Pořád ale nefunguje v JS validaci, kde nefunguje ani původní výraz (tedy žádný výraz jsem pro JS validaci nebyl schopen dát dohromady).

Problém se tedy nachází v části [^\\]. Tato část se do serverové validace přeloží jako [^\], což hlásí chybu, že není uzavřeno závorkou ].

Je troufalé to považovat za bug? Trápí mě to dnes už několik hodin a mám na tom strašný zásek. Díky moc

dakota
Člen | 148
+
0
-

Vyskúšaj

->addRule(NForm::REGEXP, 'invalid', '/^(?!.*[\x5C])(?!.*[\x2F]{2,}).*$/');
medhi
Generous Backer | 255
+
0
-

dakota: Děkuju, to funguje!

David Grudl
Nette Core | 8169
+
0
-

Mě funguje tohle na serveru i na JS:

	->addRule(Form::REGEXP, '...', '/[^\\\\]+/');

Jde o výraz /[^\\]+/, který je nutné v PHP řetězci zapsat jako '/[^\\\\]+/'. Nemůže být problém jinde? Použil jsi delimitery?

Jinak výraz /^ ...cokoliv... $/ lze zapsat přímo jako ...cokoliv..., jen místo REGEXP uveď podmínku PATTERN.