$re = '/CIgcCursor.*<.*>\s*(\w*)[^}]*?(?:while|for)\s*\(.*?\n.*?(\{(?>[^{}]|(?-1))*\})/';
$str = 'Return_t
rgRoadNameChanges(Maneuver_o *pManeuverObj, rgManeuver_t *pManeuver, bool& bIsChanged)
{
Return_t Result;
Sint_t iIndex;
utSegment_t Seg;
utSegmentInfo_t SegInfo;
Uint_t nDist = 0;
DBID_t prevNavFeatureID;
DBID_t currDBID;
CIgcCursor_Sdal<DBNavFeatureAndAttrs_t> cursorFeature(true);
bIsChanged = false;
DBID_SET_NULL(prevNavFeatureID);
iIndex = pManeuver->RouteIndex;
while (nDist < 800)
{
if ((Result = utRouteGetSegment(pManeuverObj->hRoute, &Seg, iIndex)) == SDAL_FAILURE)
return NT_SUCCESS;
if ((Result = utSegmentGetInfo(&Seg, &SegInfo, NULL)) == SDAL_FAILURE)
return NT_TRACE(Result, NT_ERR_STR("rgRoadNameChanges: utSegmentGetInfo failed!"));
if ((Result = utSegmentGetDBID(&Seg, &currDBID, NULL)) == SDAL_FAILURE)
return NT_TRACE(Result, NT_ERR_STR("rgRoadNameChanges: utSegmentGetDBID failed!"));
Result = iDbGetSegNavFeatures(&currDBID, 0, cursorFeature);
if (Result > 0)
{
// Just comparing the first nav features for now. I don\'t know if we
// need to check all against the other list in case the order of the
// nav features changes. I\'m assuming they\'ll stay the same order.
if (!(++cursorFeature).NoMoreRecords())
{
if (!DBID_IS_NULL(prevNavFeatureID)
&& (iGuCompareDBIDsEqual(&prevNavFeatureID, &cursorFeature->navFeature.navFeatureID, GU_COMPARE_FULL_IDS) != 0))
{
bIsChanged = true;
break;
}
utMemcpy(&prevNavFeatureID, &cursorFeature->navFeature.navFeatureID, sizeof(DBID_t));
}
}
nDist += SegInfo.length;
iIndex++;
}
}';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
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