Попробуйте следующее регулярное выражение:
^(?:[\p{L}\p{Mn}\p{Pd}\'\x{2019}]+\s[\p{L}\p{Mn}\p{Pd}\'\x{2019}]+\s?)+$
В PHP это означает:
if (preg_match('~^(?:[\p{L}\p{Mn}\p{Pd}\'\x{2019}]+\s[\p{L}\p{Mn}\p{Pd}\'\x{2019}]+\s?)+$~u', $name) > 0)
{
// valid
}
Вы должны прочитать это так:
^ # start of subject
(?: # match this:
[ # match a:
\p{L} # Unicode letter, or
\p{Mn} # Unicode accents, or
\p{Pd} # Unicode hyphens, or
\' # single quote, or
\x{2019} # single quote (alternative)
]+ # one or more times
\s # any kind of space
[ #match a:
\p{L} # Unicode letter, or
\p{Mn} # Unicode accents, or
\p{Pd} # Unicode hyphens, or
\' # single quote, or
\x{2019} # single quote (alternative)
]+ # one or more times
\s? # any kind of space (0 or more times)
)+ # one or more times
$ # end of subject
Iчестно говоря, не знаю, как перенести это в Javascript, я даже не уверен, что Javascript поддерживает свойства Unicode, но в PHP PCRE это , кажется, работает безупречно @ IDEOne.com :
$names = array
(
'Alix',
'André Svenson',
'H4nn3 Andersen',
'Hans',
'John Elkjærd',
'Kristoffer la Cour',
'Marco d\'Almeida',
'Martin Henriksen!',
);
foreach ($names as $name)
{
echo sprintf('%s is %s' . "\n", $name, (preg_match('~^(?:[\p{L}\p{Mn}\p{Pd}\'\x{2019}]+\s[\p{L}\p{Mn}\p{Pd}\'\x{2019}]+\s?)+$~u', $name) > 0) ? 'valid' : 'invalid');
}
Извините, я не могу помочь вам в части Javascript, но, возможно, кто-то здесь поможет.
Подтверждает :
- Джон Элкьярд
- Андре Свенсон
- Марко д'Альмейда
- Кристоффер ла Кур
Недействительно :
- Ганс
- H4nn3 Андерсен
- Мартин Хенриксен!
Чтобы заменить недопустимые символы, хотя я не уверен, зачем вам это нужно, вы простонужно немного его изменить:
$name = preg_replace('~[^\p{L}\p{Mn}\p{Pd}\'\x{2019}\s]~u', '$1', $name);
Примеры:
- H4nn3 Андерсен -> Гнн Андерсен
- Martin Henriksen! -> Martin Henriksen
Обратите внимание, что вам всегда нужно использовать модификатор u .