Как разрешить только один пробел в регулярном выражении?

Подскажите как правильно разрешить только один пробел в регулярном выражении?, по типу Вася Пупкин, и дальше уже пробелы нельзя, на этом примере

preg_match("#^([A-zА-я-ІіЇїЄє])+$#ui", $name))

Заранее спасибо


Ответы (1 шт):

Автор решения: Wiktor Stribiżew

Сначала следует обратить внимание на [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).

Последний пример поддерживает также диакритические знаки.

→ Ссылка