В этом случае лучше искать недопустимые символы, чем пытаться сопоставить все символы, как только появляется один недопустимый символ, поиск может завершиться и вернуть ошибку. Это эффективнее, чем всегда сканировать всю строку.
if (preg_match("/[^A-Za-z'-]/", $First)) { die ("invalid first name"); }
^ внутри набора [] позволяет ему соответствовать всему, что не входит в набор. и поскольку строка недопустима, если у нас есть хотя бы один недопустимый символ, для набора нет необходимости иметь оператор повторения.
Еще лучше было бы более полезное сообщение об ошибке
if (preg_match("/[^A-Za-z'-]/", $First, $Inv)) { die ("{$Inv[0]} not allowed in first name"); }