Почему регулярное выражение может не работать?
Добавь u
echo preg_match('/^[a-zA-Z\ \-]{2,20}$|^[а-яА-Я\ \-]{2,20}$/u', 'ооооооооооо');
чтобы  обрабатывать как utf-8 строку
в regex101 Вы указали флаг m, а в коде нетecho preg_match('/^[a-zA-Z\ \-]{2,20}$|^[а-яА-Я\ \-]{2,20}$/m', 'фывв');
echo preg_match('/^[a-zA-Z\ \-]{2,20}$|^[а-яА-Я\ \-]{2,20}$/m', 'ооооооооооо');

без него не работают символы ^ и $ как спецсимволы.