Для правильного вопроса надо знать половину ответа
Если preg_match возвращает false (не 0, а именно false), то в процессе разбора строки произошла ошибка. В вашем случае это Catastrophic backtracking.
Вот работающий эквивалент вашего регулярного выражения: ^(?:[a-z0-9]+(?:-[a-z0-9]+)*\.)*[a-z0-9]{2,}$i