Form::REGEXP – přesná shoda řetězce

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
tr.
Člen | 79
+
0
-

Ahoj,
možná to sem nepatří, kdyžtak mě žeňte, ale zkusím to.

Snažím se o restrikci znaků v loginu:

->addRule(Form::REGEXP, "Login může obsahovat pouze malá písmena, velká písmena, čísla a znaky '_' a '-'", '/[[a-zA-Z][a-zA-Z0–9_-]]{6,32}');

Tomu výrazu však vyhovuje jakýkoliv výskyt, takže projde třeba i:

#aAaA2222_###

Jak omezit výraz na přenou shodu řetězce a ne pouhý výskyt?

Děkuji za pomoc.

buff
Člen | 63
+
0
-

Řekl bych, že přidáním ^ na začátek toho regexpu a $ na konec (navíc jsem to trochu upravil): '/^[a-zA-Z0–9_-]{6,32}$/'. Neodzkoušeno, omlouvám se, pokud to nebude fungovat…

kravčo
Člen | 721
+
0
-

Tvoj výraz /[[a-zA-Z][a-zA-Z0–9_-]]{6,32} je veľmi zaujímavý :) Zrejme si veľa skúšal :)

  • obsahuje syntaktickú chybu, chýba ti na konci „delimiter“ / (lomka).
  • je napísaný trochu nečitateľne, zapísaný kóšer by vyzeral /[\[a-zA-Z][a-zA-Z0–9_-]\]{6,32}/.
  • nie je viazaný na celú dĺžku reťazca, uspeje aj keď nájde zhodu niekde vnútri – chýbajú mu „kotvy“ začiatok ^ resp. koniec $ reťazca
  • robí zrejme niečo úplne iné ako by si chcel…
  • ak chceš reťazec, ktorý začína malým/veľkým písmenom a môže obsahovať malé/veľké písmená, čísla a znaky „-“ a „_“ a je dlhý 6–32 znakov, správny regexp by mohol byť napr: /^[a-z][a-z0-9_-]{5,31}$/i

Vďaka tebe som bol nútený nainštalovať debugger regulárnych výrazov, dik :)

Veľmi ma totiž prekvapilo, že je (až na chýbajúcu lomku na konci) syntakticky správny… nevyzerá :)

Dokumentácia PCRE pre PHP.

buff
Člen | 63
+
0
-

kravčo: Hmmmm, slušně. Právě jsem se vrátil, protože mě napadlo, že nechce, aby to začínalo podtržítkem nebo pomlčkou, a našel jsem tady Tvůj brilantní rozbor. Díky :)

tr.
Člen | 79
+
0
-

Dekuji pekne, funguje to bezvadne.

T

Editoval tr. (18. 8. 2009 18:44)

chemikus
Člen | 47
+
0
-

Zdravím,
omlouvám se, že opět otvírám toto vlákno, ale popis regexpu zde byl celkem dobře vysvětlený a hlavně jsem to rychle pochopil. Za což děkuju. Ale já osobně používám regulární výraz

->addRule(AppForm::REGEXP, 'Vaše uživatelské jméno může obsahovat pouze písmena bez diakritiky a číslice.', '/[a-zA-Z][a-zA-Z0-9]+$/i')

A projde mi i diakritika :-/ nevíte, jak bych to měl opravit? Uživatelské jméno může začínat velké/malé písmeno a pak se může opakovat velké/malé písmeno a číslice.

Editoval chemikus (19. 10. 2009 13:15)

nAS
Člen | 277
+
0
-

Chybí ti tam kotva začátku výrazu, takže se to napasuje pouze na konec a diakritika na začátku projde. Tudíž:

/^[a-zA-Z][a-zA-Z0-9]+$/i

Editoval nAS (19. 10. 2009 13:42)

kravčo
Člen | 721
+
0
-

nAS napsal(a):

Chybí ti tam kotva začátku výrazu, takže se to napasuje pouze na konec a diakritika na začátku projde.

Presne.


Mám ešte dva hinty:

  1. Ide to skrátiť: /^[a-z][a-z0-9]+$/i (//i znamená case insensitive)
  2. Slovný popis toho, ako má vyzerať meno nie je presný, čo môže používateľa zmiasť, ak zadá superkuul meno napr. 0M3G4 (nula na začiatku). Správny popis mohol byť „Vaše uživatelské jméno může obsahovat pouze písmena bez diakritiky a číslice, musí začínat písmenem a musí mít minimální délku dva znaky.“ (ak chceš povoliť aj jednoznakové mená, zmeň + na *)