#php #regex
#php #регулярное выражение
Вопрос:
Я создал эту функцию для проверки испанских имен, и она не работает.
Это строка, которую я передаю функции:
"Ángel Manuel"
Здесь у вас есть функция:
/**
* checks First Name or Last Name
*
* @access public
* @param bool $valid
* @param string $name
* @return bool
*/
public static function checkName($valid, $name) {
if(!preg_match('/^(?=.{3,18})[A-ZÁÉÍÓÚ][a-zñáéíóú] (?:s[A-ZÁÉÍÓÚ][a-zñáéíóú] )?/', $name)) {
$valid=false;
}
return $valid;
}
Большое спасибо!
Комментарии:
1. С какой конкретной проблемой вы столкнулись? В соответствии с этим regex101.com/r/swPdWn/1 он полностью соответствует вашей входной строке.
2. Как вы используете код? Почему вы передаете
$valid
в качестве аргумента?3. А как насчет плохого
José Gómez-Iglesias
?
Ответ №1:
Вам нужно
- добавьте
$
в конце предварительного просмотра, чтобы фактически ограничить максимальную длину сопоставляемой строки,(?=.{3,18}$)
и в конце шаблона регулярных выражений (или(?=X{3,18}$)
разрешить от 3 до 18 любых графем) - добавить
u
флаг, поскольку ваш ввод представляет собой строку Unicode - используется
p{Lu}
для сопоставления любых прописных букв в Юникоде иp{Ll}
для сопоставления любых строчных букв в Юникоде - и просто возвращает
true
orfalse
в зависимости от результатаpreg_match
, нет необходимости передавать$valid
в качестве аргумента функции.
Вы можете использовать
public static function checkName($name) {
if(!preg_match('/^(?=.{3,18}$)p{Lu}p{Ll} (?:sp{Lu}p{Ll} )?$/u', $name)) {
return false;
}
return true;
}
Подробные сведения
^
— начало строки(?=.{3,18}$)
— строка должна содержать от 3 до 18 символов ((?=X{3,18}$)
чтобы разрешить от 3 до 18 любых графем)p{Lu}p{Ll}
— одна заглавная буква в Юникоде, за которой следует одна или несколько строчных букв(?:sp{Lu}p{Ll} )?
— необязательная последовательность пробелов, а затем одна заглавная буква в Юникоде, за которой следует одна или несколько строчных букв$
— конец строки.
Комментарии:
1.
return (bool)preg_match('/^(?=.{3,18}$)p{Lu}p{Ll} (?:sp{Lu}p{Ll} )?$/u', $name);