你可以用這個模式嘗試:
$pattern = <<<'LOD'
~
#definitions
(?(DEFINE)
(?<sq> '(?>[^'\\]+|\\.)*+(?>'|\z)) # content inside simple quotes
(?<dq> "(?>[^"\\]+|\\.)*+(?>"|\z)) # content inside double quotes
(?<vn> [a-zA-Z_]\w*+) # variable name
(?<crlf> \r?\n) # CRLF
(?<hndoc> <<< (["']?) (\g<vn>) \g{-2} \g<crlf> # content inside here/nowdoc
(?> [^\r\n]+ | \R+ (?!\g{-1}; $))*+
(?: \g<crlf> \g{-1}; \g<crlf> | \z)
)
(?<cmt> /\* # multiline comments
(?> [^*]+ | \* (?!/))*+
\*/
)
)
#pattern
<\?php \s+
(?> [^"'?/<]+ | \?+(?!>) | \g<sq> | \g<dq> | \g<hndoc> | \g<cmt> | [</]+)*+
(?: \?> | \z)
~xsm
LOD;
測試:
$subject = <<<'LOD'
<h1>Extract the PHP Code</h1>
<?php
echo(date("F j, Y, g:i a") . ' and a stumbling block: ?>');
/* Another stumbling block ?> */
echo <<<'EOD'
Youpi!!! ?>
EOD;
echo(' that works.');
?>
<p>Some HTML text ...</p>
LOD;
preg_match_all($pattern, $subject, $matches);
print_r($matches);
另一種方式:
馬里奧表明,它在一個評論,你可以使用標記生成器。這是最簡單的方法,因爲你不需要定義任何東西,例如:
$tokens = token_get_all($subject);
$display = false;
foreach ($tokens as $token) {
if (is_array($token)) {
if ($token[0]==T_OPEN_TAG) $display = true;
if ($display) echo $token[1];
if ($token[0]==T_CLOSE_TAG) $display = false;
} else {
if ($display) echo $token;
}
}
如果使用正則表達式,使用http://php.net/tokenizer。 – mario