Reemplazo de tags entre llaves, incluso tags anidadas, con expresiones regulares

Ejemplo

preg_replace('/\{[a-zA-Z.,\(\)0-9]+\}/', 'Replaced', 'Lorem ipsum dolor sit {tag1({tag2()})}, consectetur adipiscing elit.'); 

El resultado:

Lorem ipsum dolor sit {tag1 (Replaced)}, consectetur adipiscing elit.

Pregunta

Como puede ver, “tag2” ha sido reemplazado, pero quiero reemplazar “tag1” ¿Alguien sabe cómo puedo hacer esto?

(En algunos casos, podría ser así: {tag1({tag2({tag3()})})}) y así sucesivamente.)

Por cierto, estoy usando preg_replace_callback, pero es más fácil mostrarlo con preg_replace

Aquí hay un sitio donde puede probar el código: http://www.spaweditor.com/scripts/regex/index.php

Necesitas agregar llaves a tu juego de caracteres. Aquí está el patrón que utilicé:

 /\{[a-zA-Z.,\(\)\{\}0-9]+\}/ 

Y aquí estaba el resultado:

 "Lorem ipsum dolor sit Replaced, consectetur adipiscing elit." 

Una vez que comience a hablar sobre la coincidencia de patrones nesteds (por ejemplo: hacer coincidir el grupo entre paréntesis interno en algo como (foo (bar) fu) ), regex es la herramienta incorrecta. Las expresiones regulares son sin estado, lo que, en este caso, significa que no pueden contar cuántos corchetes están abiertos.

Si está buscando hacer algo así, es posible que deba buscar en un analizador

Es posible que desee utilizar T-Regx :

 replace($subject)->first()->with('Replaced');