$re = '/(?:^ *(?:/\*\*[^/\n]*\r?\n(?:[^/\n]*\r?\n)*[^/\n]*\*/ *|//.*)\r?\n)+(?: *[\r?\n])*#ifdef BUILD_FLAG\r?\n[\s\S]*?^#endif\r?\n/m';
$str = ' Code here
and here
//this is s comment block
/**
*and a nested comment block
*/
//-----------------------------------------------------------------------------
// this comment block should not be captured
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// this whole comment block and the conditional block below should be captured
//-----------------------------------------------------------------------------
/**
* @brief Some comment
*
xxxxx
* @return
*/
//-----------------------------------------------------------------------------
#ifdef BUILD_FLAG
...
#endif
More code
More code
//---------------------------------------------------------
// this whole comment block and the conditional block below should be captured
// --------------------------------------------------------
#ifdef BUILD_FLAG
...
#endif
More code
//-------------------------------------------------------------------------
/**
* @name this whole block comment should be captured.
* @{
*/
#ifdef BUILD_FLAG
...
#endif
';
$subst = "";
$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