![]() |
![]() ![]() |
![]() |
![]()
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:
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? |
|
|
![]()
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 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 890 Pomógł: 339 Dołączył: 14.12.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
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 |
|
|
![]()
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 |
|
|
![]()
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 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 161 Pomógł: 25 Dołączył: 6.09.2008 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Ja bym to zrobił tak:
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ć? |
|
|
![]()
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 ![]() |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 161 Pomógł: 25 Dołączył: 6.09.2008 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Wydawać by się mogło, że podany przeze mnie wzorzec nie powinien przepuszczać cyfr... Ale nie jestem znowu jakimś tam ekspertem z regex'ów ![]() 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:
uznaje ciąg "von Cos123" za poprawny pomimo tego, że we wzorcu dopuszczone są tylko litery? |
|
|
--Junior-- |
![]()
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. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 14:41 |