Jak zweryfikować czy ciąg znaków Unicode zawiera tylko litery i liczby?

Treść dodana: 16 stycznia 2016.

Istnieje wiele przypadków w których zachodzi konieczność sprawdzenia, czy ciąg wejściowy zawiera tylko litery alfabetu i liczby. W szczególności mowa o zadaniach takich jak filtracja i walidacja. Najczęściej sprawdzane są dane typu imię, nazwisko, nazwa ulicy czy też miejscowość. Zazwyczaj w takich momentach posługujemy się funkcjami wyrażeń regularnych np. preg_match. O ile sprawdzenie znaków z podstawowego zakresu [a-z] nie stanowi żadnego problemu, o tyle już znaki narodowe są pewnym wyzwaniem. Najczęściej spotykanym wzorcem dla polskiego alfabetu jest wtedy wyrażenie:

<?php

$in = 'Łucja Świątek-Gżegżółka';
$pattern = '/^[a-ząśżźćłóęńĄŚŻŹĆŁÓĘŃ -]+$/ui';

preg_match($pattern, $in, $out);

var_dump($out);

Modyfikator u każe traktować wzorzec oraz ciąg wejściowy jako znaki UTF-8, z kolei i bierze pod uwagę małe oraz wielkie litery.

Problem powstanie jeżeli osoba chcąca się zarejestrować jest przykładowo Niemką z polskim obywatelstwem. Łucja Müller-Gżegżółka nie będzie pasować do wzorca, stąd zapewne dział techniczny otrzyma maila z prośbą o wprowadzenie poprawek. Z pomocą przychodzą kategorie znaków które dość dobrze opisane są na stronie regular-expressions.info. Wszystkie znaki Unicode przypisane są do określonych grup, co bardzo ułatwia ich sprawdzanie. I tak, dwie podstawowe będące tematem artykułu, to:

\p{L} lub \p{Letter} - znak traktowany jako litera w dowolnym języku
\p{N} lub \p{Number} - dowolny typ numeryczny
<?php

$in = 'Łucja Müller-Gżegżółka';
$pattern = '/^[\p{L} -]+$/u';

preg_match($pattern, $in, $out);

var_dump($out);

Do sprawdzenia ulicy z numerem domu możemy użyć wzorca:

$pattern = '/^[\p{L}\p{Nd} -]+$/u';

Lub po prostu:

$pattern = '/^[\p{L}0-9 -]+$/u';

Ponieważ wzorzec `\p{N}` zawiera w sobie także np. litery rzymskie (Ⅲ), ograniczyliśmy znaki za pomocą {Nd} do typowych cyfr od 0 do 9. Dzięki temu będziemy w stanie poprawnie zweryfikować takie dane jak:

$in = 'Jakobstraße 30a';
$in = 'Śmigłego-Rydza 13';

Komentarze

Nie ma jeszcze żadnych komentarzy do wyświetlenia. Może chcesz zostać pierwszą osobą która podzieli się swoją opinią?

Dodaj komentarz

*
Nazwa zostanie wyświetlona wraz z komentarzem. Możesz też utworzyć nowe konto w serwisie, dzięki czemu uzyskasz dodatkową funkcjonalność.
*
Akceptowana jest ograniczona składnia Textile. Wszystkie tagi HTML zostaną usunięte.