0

我需要一个可以在文件中找到 PHP 代码块的正则表达式。例如:

    <? print '<?xml version="1.0" encoding="UTF-8"?>';?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    <head>
        <?php echo "stuff"; ?>
    </head>
    <html>

由 REGEX 解析时将返回:

array(
    "<? print '<?xml version=\"1.0\" encoding="UTF-8"?>';?>",
    "<? echo \"stuff\"; ?>"
);

您可以假设 PHP 是有效的。

4

5 回答 5

7

token_get_all您将获得给定 PHP 代码的PHP语言标记列表。然后您只需要迭代列表,查找打开标记标记和相应的关闭标记。

$blocks = array();
$opened = false;
foreach (token_get_all($code) as $token) {
    if (!$opened) {
        if (is_array($token) && ($token[0] === T_OPEN_TAG || $token[0] === T_OPEN_TAG_WITH_ECHO)) {
            $opened = true;
            $buffer = $token[1];
        }
    } else {
        if (is_array($token)) {
            $buffer .= $token[1];
            if ($token[0] === T_CLOSE_TAG) {
                $opened = false;
                $blocks[] = $buffer;
            }
        } else {
            $buffer .= $token;
        }
    }
}
于 2010-07-02T14:59:08.430 回答
2

这是更适合自定义解析器的任务类型。您可以使用堆栈相对轻松地构建一个,我可以保证您将比尝试调试正则表达式更快地完成并且减少头发。

如果使用得当,正则表达式是很好的工具,但并非所有文本解析任务都是平等的。

于 2010-07-02T14:49:07.237 回答
0

尝试使用以下正则表达式preg_match()

/<\?(?:php)?\s+(.*?)\?>/

这是未经测试的,但这是一个开始。它假定一个结束 PHP 标记(可以说是格式良好的)。

于 2010-07-02T14:48:40.467 回答
0

试试这个正则表达式(未经测试):

preg_match_all('@<\?.*?\?>@si',$html,$m);
print_r($m[0]);
于 2010-07-02T14:54:22.030 回答
0
<\?(?:php)?\s+.*?\?>$

带有以下修饰符:

点匹配换行符

^& 匹配换行符

于 2010-07-02T14:56:28.330 回答