2010-09-29 16 views
6

Ciągle jeszcze nie używam Wyrażeń regularnych, więc oto moja sytuacja. Mam pewne zasady dotyczące akceptowanych nazw użytkowników i staram się je wyrazić.Wyrażenie regularne do sprawdzania poprawności nazwy użytkownika?

Oto one:

  • 1-15 znaków
  • az, AZ, 0-9, i przestrzenie są dopuszczalne
  • Musi zacząć az lub AZ
  • nie może zakończyć się w przestrzeni
  • nie może zawierać dwa miejsca w rzędzie

to jest tak daleko, jak mam iść z nim.

/^[a-zA-Z]{1}([a-zA-Z0-9]|\s(?!\s)){0,14}[^\s]$/ 

Działa w przeważającej części, ale nie pasuje do pojedynczego znaku, takiego jak "a".

Czy ktoś może mi pomóc? Używam PCRE w PHP, jeśli to robi jakąkolwiek różnicę.

+0

Uwaga że '\ s' nie jest po prostu spacją, ale jest równy '[\ x09 \ x0A \ x0C \ x0D \ x20]'. – Gumbo

+0

Użyj tego narzędzia (http://public.kvalley.com/regex/regex.asp), aby zweryfikować i poprawić wyrażenia reg. –

Odpowiedz

7

Spróbuj tego:

/^(?=.{1,15}$)[a-zA-Z][a-zA-Z0-9]*(?: [a-zA-Z0-9]+)*$/ 

wygląd wyprzedzeniem twierdzenie (?=.{1,15}$) kontrole długość i reszta sprawdza strukturę:

  • [a-zA-Z] zapewnia, że ​​pierwszy znak jest znakiem alfabetu;
  • [a-zA-Z0-9]* pozwala na dowolną liczbę następujących znaków alfanumerycznych;
  • (?: [a-zA-Z0-9]+)* umożliwia dowolną liczbę sekwencji jednej przestrzeni (nie \s który umożliwia dowolny znak spacje), które muszą być przestrzegane przez co najmniej jeden znak alfanumeryczny (patrz PCRE subpatterns for the syntax of (?:…)).

Można również usunąć potwierdzenie wyprzedzenia i sprawdzić długość przy pomocy strlen.

+0

@Bart K .: Dzięki. :) – Gumbo

+0

Jesteś ratownikiem! Czy możesz wyjaśnić nieco więcej o tym, jak to działa? Nadal się uczę i nic z tego nie ma dla mnie większego sensu. – dan

0

Głównym problemem Twojego regexp jest to, że potrzebuje przynajmniej dwa znaki dwa mają mecz:

  • jeden dla [a-zA-Z]{1} części
  • jeden dla [^\s] części

Oprócz tego problemu widzę niektóre części Twojego regexp, które można poprawić:

  • Klasa [^\s] będzie pasować do dowolną postacią, z wyjątkiem spacji: kropka lub średnik będą akceptowane, spróbuj użyć tutaj klasy [a-zA-Z0-9], aby upewnić się, że znak jest poprawny.
  • Można usunąć {1} udział na początku, jak Regexp dokładnie jeden znak domyślnie
+0

Spowoduje to dopasowanie ciągów z spacją pod koniec. – NullUserException

+0

Teraz pasuje również do ciągów kończących się białymi znakami. – Gumbo

+0

@NUE & Gumbo: Dzięki, nie zdawałem sobie sprawy na początku. Usunąłem niepoprawne sugestie i skupiłem się oraz problemy z oryginalnym wyraże. –

0

uczynić wszystko po pierwszym charakter opcjonalny

^[a-zA-Z]?([a-zA-Z0-9]|\s(?!\s)){0,14}[^\s]$ 
+0

Spowoduje to również dopasowanie ciągów nie rozpoczynających się od '[a-zA-Z]' i kończących się na '[a-zA-Z0-9]'. – Gumbo

Powiązane problemy