Как разрешить только один пробел в регулярном выражении?
Подскажите как правильно разрешить только один пробел в регулярном выражении?, по типу Вася Пупкин, и дальше уже пробелы нельзя, на этом примере
preg_match("#^([A-zА-я-ІіЇїЄє])+$#ui", $name))
Заранее спасибо
Ответы (1 шт):
Сначала следует обратить внимание на [A-z] в вашем выражении: этот щаблон находит не только латинские буквы, вместо него надо использовать [A-Za-z]. Знак - лучше поставить в конце символьного класса, а не сразу после диапазона символов.
Чтобы разрешить (но не требовать) один пробел в вашем регулярном выражении, используйте
preg_match("#^[A-Za-zА-яІіЇїЄє-]+(?: [A-Za-zА-яІіЇїЄє-]+)?$#Du", $name)
Вместо обычного пробела можно использовать \s, который разрешит использование любых пробельных символов (\h для всех пробельных символов, кроме символов перевода строки).
Варианты:
"#^\p{L}+(?: \p{L}+)?$#Du"
"#^\p{L}+(?: \p{L}+)?\z#u"
"#^\p{L}+(?:\h\p{L}+)?\z#u"
"#^(?:\p{L}\p{M}*+)+(?:\h(?:\p{L}\p{M}*+)+)?\z#u"
\p{L} находит любую букву.
\z означает абсолютный конец строки (в отличие от $, для которого требуется флаг D).
Последний пример поддерживает также диакритические знаки.