fix(Validators): allow pipe in pattern regular expressions
The 'pattern:' argument of Validators::is() crashed on a valid regular
expression containing a pipe, e.g. Validators::is('a', 'pattern:(a|b)').
Two parsing bugs combined: the expression was split into validators on every
'|', tearing the regexp apart, and the pipe was also used as the PCRE
delimiter. A 'pattern:' argument now consumes the rest of the expression and
the delimiter is changed to '~', with the pattern anchored as a whole so bare
alternations work too. Pipe-as-OR semantics for combined validators are kept.
Fixes nette/utils#206
This commit is contained in:
1 parent
385c8ee43f
commit
4cded8d046
2 files changed
+32
-8
No files matched your search
@@ -259,6 +259,25 @@ test('validates string against a regular expression pattern', function () {
|
||||
});
|
||||
|
||||
|
||||
test('allows pipe inside a regular expression pattern', function () {
|
||||
// grouped alternation, https://github.com/nette/utils/issues/206
|
||||
Assert::true(Validators::is('a', 'pattern:(a|b)'));
|
||||
Assert::true(Validators::is('b', 'pattern:(a|b)'));
|
||||
Assert::false(Validators::is('c', 'pattern:(a|b)'));
|
||||
|
||||
// bare alternation must no longer throw and is anchored as a whole
|
||||
Assert::true(Validators::is('a', 'pattern:a|b'));
|
||||
Assert::true(Validators::is('b', 'pattern:a|b'));
|
||||
Assert::false(Validators::is('c', 'pattern:a|b'));
|
||||
Assert::false(Validators::is('ab', 'pattern:a|b'));
|
||||
|
||||
// a pattern combined with other validators
|
||||
Assert::true(Validators::is(5, 'int|pattern:(a|b)'));
|
||||
Assert::true(Validators::is('a', 'int|pattern:(a|b)'));
|
||||
Assert::false(Validators::is('c', 'int|pattern:(a|b)'));
|
||||
});
|
||||
|
||||
|
||||
test('ensures alphanumeric string meets minimum length', function () {
|
||||
Assert::false(Validators::is('', 'alnum'));
|
||||
Assert::false(Validators::is('a-1', 'alnum'));
|
||||
|
||||
Reference in new issue
Block a user