Найти PHP с помощью REGEX - PullRequest
0 голосов
/ 02 июля 2010

Мне нужен REGEX, который может найти блоки кода 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 действителен.

Ответы [ 5 ]

7 голосов
/ 02 июля 2010

С 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;
        }
    }
}
2 голосов
/ 02 июля 2010

Этот тип задачи лучше подходит для пользовательского анализатора.Вы могли бы относительно легко создать его, используя стек, и я могу гарантировать, что вы сделаете это намного быстрее и потратите меньше времени, чем пытались бы отлаживать свое регулярное выражение.

Регулярные выражения - это отличные инструменты при правильном использовании, но не всезадачи разбора текста равны.

0 голосов
/ 02 июля 2010
<\?(?:php)?\s+.*?\?>$

со следующими модификаторами:

Новые строки соответствуют точкам

^ & соответствуют разрывам строк

0 голосов
/ 02 июля 2010

Попробуйте это регулярное выражение (не проверено):

preg_match_all('@<\?.*?\?>@si',$html,$m);
print_r($m[0]);
0 голосов
/ 02 июля 2010

Попробуйте следующее регулярное выражение, используя preg_match()

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

Это не проверено, но это начало. Предполагается закрывающий тег PHP (возможно, правильно сформированный).

...