Muchísimas gracias, Lanselot, me parece que sin entendernos ambos del todo has logrado darme la pista que resuelve el problema. Dicha pista radica en el modificador
U que vuelve a los cuantificadores menos "codiciosos" y tienden a coger el resultado más "pequeño" que cumpla con el patrón:
http://es.php.net/manual/es/referenc....modifiers.php
Y el problema era éste:
Si entendemos '-----' por contenido "de relleno" que no es importante, está claro que ahí hay dos etiquetas cuyo contenido quiere leerse. Si ejecutamos el código anterior, $res[1] contendrá lo siguiente:
Sin embargo, una solución que podría ser leer el contenido con esta sentencia:
Código:
preg_match('/#1#([^@]*)@1@/', $string, $res);
No sirve para nada, porque hay una arroba dentro del contenido de las dos etiquetas. La clave, por tanto, es hacer a los cuantificadores menos "codiciosos" y que detecten el contenido menos amplio que cumpla con el patrón.
Un saludo y muchísimas gracias por todo


PD: esto del modificador U debería aparecer en la información de preg_match en php.net de forma clara, ya que si queremos hacer un parser XML "casero" (o similar, que es lo que quiero hacer) vamos a necesitarlo de forma irremediable. Además, en muchas aplicaciones nos puede interesar coger el contenido más "pequeño" que cumpla la expresión regular en lugar del más largo. Se me ocurre, por ejemplo, un "traductor" de código phpBB.