Совпадает только набор символов из того же языка (например, имя Facebook)?

preg_match(???, 'firstname lastname') // true;
preg_match(???, '서프 누워') // true;
preg_match(???, '서프 lastname') // false;
preg_match(???, '#$@ #$$#') // false;

В настоящее время я использую:

'/^([一-龠0-9\s]+|[ぁ-ゔ0-9\s]+|[ก-๙0-9\s]+|[ァ-ヴー0-9\s]+|[a-zA-Z0-9\s]+|[々〆〤0-9\s]+)$/u'

Но это работает только на некоторых языках.

10

Решение

Вам нужно выражение, которое будет соответствовать только символам из того же скрипт в юникоде (и пробелы), как:

 ^([\p{SomeScript} ]+|[\p{SomeOtherScript} ]+|...)$

Вы можете динамически построить это выражение из списка скриптов:

$scripts = "Hangul Hiragana Han Latin Cyrillic"; // feel free to add more

$re = [];
foreach(explode(' ', $scripts) as $s)
$re [] = sprintf('[\p{%s} ]+', $s);
$re = "~^(" . implode("|", $re) . ")$~u";

print preg_match($re, 'firstname lastname'); // 1
print preg_match($re, '서프 누워'); // 1
print preg_match($re, '서프 lastname'); // 0
print preg_match($re, '#$@ #$$#'); // 0

Однако обратите внимание, что в именах (по крайней мере, в европейских скриптах, с которыми я знаком) обычно встречаются символы, такие как точки, тире и апострофы, которые относятся к «общему» сценарию, а не к конкретному языку. Чтобы принять это во внимание, более реалистичная версия «чанка» в вышеприведенном выражении может быть такой:

 ((\p{SomeScript}+(\. ?|[ '-]))*\p{SomeScript}+)

который по крайней мере правильно подтвердит L. A. Léon de Saint-Just,

В общем, проверка имен людей является сложной проблемой и не может быть решена со 100% точностью. Увидеть этот забавный пост и комментарии там для деталей и примеров.

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]