Мое регулярное выражение неправильно проверяет имена

#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 or false в зависимости от результата 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);