Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Wyrażenie regularne - problem
Forum PHP.pl > Forum > Przedszkole
Aravorn
Cześć :) . Buduję sobie nową klasę do walidacji pewnych danych. Siadłem teraz do funkcji sprawdzającej poprawność wprowadzanego ciągu:
- może to być jedno słowo
- może to być kilka słów oddzielonych pojedynczą spacją

Podane wyrażenia mają celowo uproszczone zakresy i nie tylko, aby zwiększyć czytelność

Wykrywanie jednego słowa: /^[a-z]+$/
Wykrywanie dwóch słów oddzielonych pojedynczą spacją (\s nie używam celowo): /^[a-z]+ [a-z]+$/

No ale w jednym ciągu może być jednocześnie jedno, dwa lub więcej słów. W związku z czym chciałem połączyć to w jedno wyrażenie regularne, zastosowałem więc alternatywę: /^(?:[a-z]+)|(?:(?:[a-z]+ )+)$/
Akceptuje wyrażenia: a, a b, a b c. Ale również zostają przyjęte wyrażenia, w których występuje kilka spacji.. czyli wyrażenie: a b przejdzie walidację.
Mógłbym to z poziomu funkcji PHP sprawdzić, czy istnieje gdzieś ciąg ' ' (dwie spacje), który wykryłby dwa lub więcej białych znaków, ale chciałbym to rozwiązać na poziomie wyrażenia regularnego :>
Próbowałem też tego: /^(?:[a-z]+)|(?:(?:[a-z]+ [a-z]+)+)$/, ale przyniosło dokładnie taki sam efekt jak przedtem.

Dla Waszej wygody:
  1. if(preg_match($Pattern, $String))
  2. {
  3. echo 'dziala';
  4. }
  5. else
  6. {
  7. echo 'nie dziala';
  8. }


Jest pewnie jakieś proste rozwiązanie mojego problemu, próbowałem z zachłannością i leniwością, ale bez skutku (i tak to nic chyba nie pomoże w tym przypadku).

Jak mówiłem uprościłem to maksymalnie jak się da, żeby tylko było łatwo odczytać treść;) Nie widzę tu błędu logicznego, a możliwe, że taki tu istnieje.

Proszę o pomoc i pozdrawiam,
Aravorn
gr56
  1. ^(?:[a-z]+)$|^(?:[a-z]+\s[a-z]+)*$


Polecam Ci strone www.rubular.com, pozwala szybko testować regexpy.
Aravorn
Dzięki wielkie smile.gif wstawienie odpowiednio $ i ^ pomogło.
Pisałem, że nie używam \s, bo wykrywa nie tylko spacje. Normalna spacja w wyrażeniu załatwia problem, żaden tabulator nie przechodzi wtedy - może się komuś przydać, bo często chodzi ludziom o wykrywanie tylko spacji, nie pozostałych białych znaków smile.gif
Crozin
Nieco bardziej przejrzystą formą byłoby
Kod
^[a-z]+(?: [a-z]+)*$
Czyli jeden wyraz i dowolna ilość wyrazów poprzedzonych pojedynczą spacją.
Aravorn
Crozin - dzięki smile.gif no tak, teraz widać, że za bardzo kombinowałem. To będzie chyba najlepsze rozwiązanie wink.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.