¿Cómo dejar que Regex ignore todo entre paréntesis?

Considere la siguiente cadena:

I have been driving to {Palm.!.Beach:100} and it . was . great!! 

Utilizo la siguiente expresión regular para eliminar toda la puntuación:

 $string preg_replace('/[^a-zA-Z ]+/', '', $string); 

Esto produce:

 I have been driving to PalmBeach and it was great!! 

Pero necesito la expresión regular para ignorar siempre lo que esté entre {y}. Entonces, el resultado deseado sería:

 I have been driving to {Palm.!.Beach:100} and it was great 

¿Cómo puedo dejar que la expresión regular ignore qué hay entre {y}?

Prueba esto

 [^a-zA-Z {}]+(?![^{]*}) 

Véalo aquí en Regexr

Los medios coinciden con cualquier cosa que no esté incluida en la clase de caracteres negada, pero solo si no hay un corchete de cierre por delante sin una apertura anterior, esto se hace mediante la búsqueda anticipada negativa (?![^{]*}) .

 $string preg_replace('/[^a-zA-Z {}]+(?![^{]*})/', '', $string); 
 $str = preg_replace('(\{[^}]+\}(*SKIP)(*FAIL)|[^a-zA-Z ]+)', '', $str); 

Consulte también División de cadena por delimitador, pero no si se ha escapado .