Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [regexp] Walidacja nazwiska
piaseq
post
Post #1





Grupa: Zarejestrowani
Postów: 161
Pomógł: 25
Dołączył: 6.09.2008
Skąd: Warszawa

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


Chcę stworzyć funkcję walidującą nazwisko, w oparciu o wyrażenia regularne. Zakładam dopuszczenie trzech form nazwiska:
- nazwisko jednoczłonowe, złożone z polskich znaków, zaczynające się dużą literą, np. Kowalski
- nazwisko dwuczłonowe, złożone z polskich znaków, np. Kowalska-Brzęczyszczykiewicz
- nazwisko dwuczłonowe, złożone ze znaków a-z w formie trzyliterowego "przedrostka" pisanego małymi literami oraz nazwiska właściwego zaczynającego się dużą literą, np. van Deurse. Napisałem takie oto wyrażenie regularne:
  1. <?php
  2. preg_match( '/^(([A-ZŁŻ][a-ząęóżźćńłś]{2,})(-[A-ZŁŻ][a-ząęóżźćńłś]{2,})?)|([a-z]{3} [A-Z][a-z]{2,})$/u', $surname );
  3. ?>


Problem, z którym się borykam polega na tym, że funkcja preg_match() sprawdza do pierwszego wystąpienia i zwróci 1 w przypadku gdy co najmniej 3 pierwsze znaki pasują, więc nazwisko Kow123 zostanie uznane za poprawne.

Rozwiązanie jest zapewne banalne, ale z powodu mojego małego doświadczenia z wyrażeniami regularnymi lektura manuala nie naprowadziła mnie na nie. Czy ktoś ma pomysł jakiej innej funkcji użyć lub jak zmodyfikować wyrażenie, abym uzyskał oczekiwany rezultat?
Go to the top of the page
+Quote Post
Spyder
post
Post #2





Grupa: Zarejestrowani
Postów: 269
Pomógł: 7
Dołączył: 12.10.2006
Skąd: Newcastle Upon Tyne

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


A dlaczego nie dodasz ograniczenia na inpucie do wpisywania tylko liter i myslnika i spacji ?


--------------------
Portfolio

Windows Vista Business SP1
DELL VOSTRO 200, Intel Core2 DUO E4600 2.4GHz, 3 GB RAM, ATI Radeon HD 2400 Pro, Screen DELL 22"

Pomogłem ci -> Kliknij "Pomógł" -> Dzięki
Go to the top of the page
+Quote Post
sowiq
post
Post #3





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

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


Cytat(Spyder @ 22.10.2008, 23:51:52 ) *
A dlaczego nie dodasz ograniczenia na inpucie do wpisywania tylko liter i myslnika i spacji ?

Ponieważ to najgorsze z możliwych rozwiązań i może służyć tylko jako pewnego rodzaju udogodnienie.
Podam Ci co najmniej dwa argumenty:
1) taki sposób opiera się na JS, którą można wyłączyć
2) ktoś może zrobić upload danych z innego formularza - bez walidacji po stronie serwera może Ci zrobić niezłą sieczkę

[edit]
Ja bym to zrobił tak:
Kod
preg_match("/^([a-z]{2,3} [A-ZŁŻ][a-ząęóżźćńłś]{2,})|([A-ZŁŻ][a-ząęóżźćńłś]{2,})(\-[A-ZŁŻ][a-ząęóżźćńłś]{2,})?$/u", $surname);


Ten post edytował sowiq 22.10.2008, 23:51:44
Go to the top of the page
+Quote Post
Spyder
post
Post #4





Grupa: Zarejestrowani
Postów: 269
Pomógł: 7
Dołączył: 12.10.2006
Skąd: Newcastle Upon Tyne

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


zawsze mozesz dodac to do tego co masz jako 2 stopien filtracji to zeby weliminowac cyfry:

preg_match("/^[0-9\-\ ]+$/",$cos)

Ten post edytował Spyder 22.10.2008, 23:56:55


--------------------
Portfolio

Windows Vista Business SP1
DELL VOSTRO 200, Intel Core2 DUO E4600 2.4GHz, 3 GB RAM, ATI Radeon HD 2400 Pro, Screen DELL 22"

Pomogłem ci -> Kliknij "Pomógł" -> Dzięki
Go to the top of the page
+Quote Post
sowiq
post
Post #5





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

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


Twój kod zwróci true tylko wtedy, jeśli $coś będzie składało się wyłącznie z kombinacji cyfr, myślnika i spacji. Tutaj to bezużyteczne.

A moim zdaniem łatwiej jest sprawdzić czy string jest poprawny, niż sprawdzać każdą możliwą kombinację jego niepoprawności.

Ten post edytował sowiq 23.10.2008, 00:01:25
Go to the top of the page
+Quote Post
piaseq
post
Post #6





Grupa: Zarejestrowani
Postów: 161
Pomógł: 25
Dołączył: 6.09.2008
Skąd: Warszawa

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


Cytat(sowiq @ 23.10.2008, 00:40:48 ) *
Ja bym to zrobił tak:
  1. <?php
  2. preg_match("/^([a-z]{2,3} [A-ZŁŻ][a-ząęóżźćńłś]{2,})|([A-ZŁŻ][a-ząęóżźćńłś]{2,})(-[A-ZŁŻ][a-ząęóżźćńłś]{2,})?$/u", $surname);
  3. ?>

Z tego co widzę twój kod różni się od mojego głównie zamianą kolejności wyrażeń po obu stronach alternatywy. To rzeczywiście rozwiązuje problem z polskimi nazwiskami jedno i dwuczłonowymi. Niestety teraz nazwisko van Deu123 jest uznawane za poprawne.

Wynika z tego, że preg_match() regułę przed alternatywą sprawdza do pierwszego wystąpienia wzorca, czyli, za poprawne uznane zostaną wszystkie ciągi, których pierwsze sześć znaków pasuje do wzorca( np. van Deu*). Natomiast w przypadku wyrażenia znajdującego się za znakiem alternatywy sprawdzany jest cały ciąg, więc nazwisko Kow123 jest rozpoznawane jako błędne.

Czy ktoś mógłby wyjaśnić dlaczego tak się dzieje i co z tym fantem zrobić?
Go to the top of the page
+Quote Post
sowiq
post
Post #7





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

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


Wystarczyło dodać nawias:

Kod
preg_match("/^(([a-z]{2,3} [A-ZŁŻ][a-ząęóżźćńłś]{2,})|([A-ZŁŻ][a-ząęóżźćńłś]{2,}))(\-[A-ZŁŻ][a-ząęóżźćńłś]{2,})?$/u", $surname);


A co do problemu, który opisałeś (van Deu*), to nie umiem Ci odpowiedzieć. Wydawać by się mogło, że podany przeze mnie wzorzec nie powinien przepuszczać cyfr... Ale nie jestem znowu jakimś tam ekspertem z regex'ów smile.gif
Go to the top of the page
+Quote Post
piaseq
post
Post #8





Grupa: Zarejestrowani
Postów: 161
Pomógł: 25
Dołączył: 6.09.2008
Skąd: Warszawa

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


Cytat(sowiq @ 23.10.2008, 12:28:29 ) *
Wydawać by się mogło, że podany przeze mnie wzorzec nie powinien przepuszczać cyfr... Ale nie jestem znowu jakimś tam ekspertem z regex'ów smile.gif

Ja również sądziłem, że nie przepuści cyfr. Dla ciebie pomógł za poprzednią wersję, gdyż rozwiązała mój problem z nazwiskami polskimi. Nazwiska w formie "van ..." nie są dla mnie aż tak ważne, ale chociażby z ciekawości chciałbym poznać rozwiązanie.

Dlatego ponawiam pytanie do innych użytkowników. Czy ktoś wie dlaczego wyrażenie:

  1. <?php
  2. preg_match("/^([a-z]{2,3} [A-ZŁŻ][a-ząęóżźćńłś]{2,})|([A-ZŁŻ][a-ząęóżźćńłś]{2,})(-[A-ZŁŻ][a-ząęóżźćńłś]{2,})?$/u", $surname);
  3. ?>

uznaje ciąg "von Cos123" za poprawny pomimo tego, że we wzorcu dopuszczone są tylko litery?
Go to the top of the page
+Quote Post
--Junior--
post
Post #9





Goście







Ja użyłem takiego wzoru :
$wzor_nazwisko = '/^[A-ZŁŻ]{1}[a-ząęóżźćńłś]*\s?[A-ZŁŻ]{1}[a-ząęóżźćńłś]*$/';

i przed sprawdzeniem poprawności korzystam z ucwords() żeby każdy wyraz zaczynał się od wielkiej litery.
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: 21.08.2025 - 14:41