Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Wyrażenie regularne - problem
Aravorn
post
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 6.04.2012

Ostrzeżenie: (0%)
-----


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

Ten post edytował Aravorn 15.07.2012, 13:50:43
Go to the top of the page
+Quote Post
gr56
post
Post #2





Grupa: Zarejestrowani
Postów: 77
Pomógł: 15
Dołączył: 19.11.2011

Ostrzeżenie: (0%)
-----


  1. ^(?:[a-z]+)$|^(?:[a-z]+\s[a-z]+)*$


Polecam Ci strone www.rubular.com, pozwala szybko testować regexpy.

Ten post edytował gr56 15.07.2012, 14:06:51
Go to the top of the page
+Quote Post
Aravorn
post
Post #3





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 6.04.2012

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Crozin
post
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Nieco bardziej przejrzystą formą byłoby
Kod
^[a-z]+(?: [a-z]+)*$
Czyli jeden wyraz i dowolna ilość wyrazów poprzedzonych pojedynczą spacją.
Go to the top of the page
+Quote Post
Aravorn
post
Post #5





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 6.04.2012

Ostrzeżenie: (0%)
-----


Crozin - dzięki smile.gif no tak, teraz widać, że za bardzo kombinowałem. To będzie chyba najlepsze rozwiązanie wink.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 09:32