簡體   English   中英

使用REGEX查找PHP

[英]Find PHP with REGEX

我需要一個可以在文件中找到PHP代碼塊的REGEX。 例如:

    <? 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是有效的。

使用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;
        }
    }
}

這是一種更適合自定義解析器的任務類型。 您可以相對容易地使用堆棧來構造一個堆棧,並且我可以保證比調試正則表達式更快,更輕松地完成工作。

如果正確使用正則表達式是很好的工具,但並非所有的文本解析任務都相等。

使用preg_match()嘗試以下正則表達式

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

這未經測試,但這是一個開始。 它假定有一個封閉的PHP標記(可以說格式正確)。

試試這個正則表達式(未試用):

preg_match_all('@<\?.*?\?>@si',$html,$m);
print_r($m[0]);
<\?(?:php)?\s+.*?\?>$

具有以下修飾符:

點匹配換行符

^&在換行符匹配

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM