$re = '@(?imx)
(^\h*) # capture les espaces avant #cs (ex. < >#cs)
(
\# (?> cs|comments-start ) \b\N*\R # => #cs
# => commentaires (partie entre #cs et #ce)
(?:
# vérifie qu\'il s\'agit bien d\'un commentaire
# c.-à-d. que le début de la ligne NE doit PAS être suivi par ce qui
# correspond à un début (#cs) ou fin de commentaire (#ce)
(?!
\h* \# (?> cs|comments-start|ce|comments-end ) \b\N*\R
)
# le commentaire
# un commentaire peut simplement être une nouvelle ligne (\R)
\N*\R
| # commentaire ou récursion (si aucun commentaire trouvé)
# récursion (depuis le début) pour chercher un nouveau #cs
(?R)
)* # les commentaire sont facultatifs
\h* \# (?> ce|comments-end ) # => #ce
\b\N*? # texte après #ce, facultatif (ex. #ce< TEXTE>)
)
# capture, s\'il y en a, les espaces et la fin de ligne après #ce (ex. #ce blabla...< \R>)
(
\h*+ $ # espaces après #ce ; seulement ceux avant la fin de ligne (ex. #ce blabla...< >$)
\R? # retour à la ligne facultatif
)@imx';
$str = ' #cs xyz
gna
#cs xyz
gna gna
#ce #ce
#ce #ce
#ce
#cs xyz
gna gna
#ce xyz
-------------------------------------
#cs
...
#
#cs
#cs
#cs
...
#cs
...
#ce
#ce
#ce
#ce
;#ce
#ce
#ce
-------------------------------------
#comments-start BON
...
#
#cs
...
#cs
...
#ce
#ce
...
#ce
-------------------------------------
#comments-start BON
...
#
#comments-start
...
#cs
...
#comments-end
#ce
...
#comments-end
#comments-end
-------------------------------------
#cs
;#cs
;#ce
#ce u u u u
#cs
;#cs
;#ce
#ce u u u u
#cs
;#cs
;#ce
#ce u u u u
#cs
;#cs
;#ce
#ce
#cs
;#cs
;#ce
#ce i
#cs
;#cs
;#ce
#ce i
#cs
;#cs
;#ce
#ce i
-------------------------------------
#cs,test
...
#cs...
.#cs.. NE_PAS_CAPTURER
#ceNE_PAS_CAPTURER
...
#ce
#ce
#ce
-------------------------------------
#cs
#ce
#comments-start
...
#
#cs
#cs
...
#cs---
...
#
# ce NE_PAS_CAPTURER
#ce
#ce
#ce
#ce
#ce
...
-------------------------------------
--------- [NE PAS CAPTURER] ---------
#ce
#ce
#ce
#cs
#cs
#cs
#cs
#cs
#cs
';
$subst = "[\1]<span class=\"S2\">\2</span>[\3]";
$result = preg_replace($re, $subst, $str);
echo "The result of the substitution is ".$result;
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for PHP, please visit: http://php.net/manual/en/ref.pcre.php