Не нужно оборачивать одиночные символы в квадратные скобки. Можно писать их просто так. Для символов со специальным значением (плюс и скобки) нужно использовать экранирование обратным слэшем. Чтобы не плодить по два слэша, используйте строку с одинарными кавычками. Тире, если не внутри квадратных скобок, спецсимволом не является и экранировать его не нужно.
Итого:
preg_match('/^\+380\([0-9]{2}\)[0-9]{3}-[0-9]{2}-[0-9]{2}$/i', $phone)
Если в каком-то месте могут быть пробелы, можно добавить туда
\s*
. Если пробелы могут быть где угодно, проще сначала заменить пробел на пустую строку по всему значению.