[英]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.