我試圖創建一個PHP模板引擎爲學習的原因。如何匹配從上到下的正則表達式出現
假設我們有跟隨陣列:
$regexList = [
'varPattern' => '/{{\s*\$(.*?)\s*}}/',
'loopPattern' => '/@for\((.*?)\)\s*{{((?:[^{}]|(?R))*)}}/',
'statementPattern' => '/@if\((.*?)\)\s*{{((?:[^{}]|(?R))*)}}/'
]
和遵循功能:
getVar($varName);
loop($arrayName);
getStatementResult($booleanExpression);
和串波紋管:
$string = '
<span>{{ $fullName }}</span>
@for($names as $name)
{{
@if($name == 'Eleandro)
{{
<p>{{ $name }}</p>
}}
}} ';
這個想法是從上到下閱讀字符串,並依靠正則表達式的列表找到結果並將其賦給正確的函數。
例如:首先要找到必須爲{{$string}}
,所以我們通過變量名稱爲getVar($matchedVarName)
功能。
下一步必須是@loop(){{ }}
,所以,我們叫loop($matchedArrayName);
和內部循環必須要瑤池的@if(){{ }}
,所以,我們得到的結果,分給getStatementResult($matchedBooleanExpression)
與相匹配的值。
我該如何以正確的順序(從上到下)進行操作?謝謝。
就是這樣,理解那裏發生的事情有點複雜,但是。我現在使用preg_replace_callback,所以,我會嘗試使用帶PREG_OFFSET_CAPTURE標誌的preg_match_all來完成這項工作,而不是像您已經完成的那樣。謝啦! – e200
有一個問題,如果我改變功能的順序爲 $ functions = ['loop','getVar','getStatementResult'];它不會首先獲取var,它需要首先獨立於訂單獲取var。否則,我將無法執行出現在var之前的語句,它將是靜態的,所以,我將不得不始終執行相同的順序:var,loop,statement,如果有人創建了一個以語句開頭的模板將失敗! – e200
函數的順序必須與'$ regexList'中正則表達式的順序相匹配。這段代碼會按照它們出現在字符串中的順序報告變量,語句和循環,我認爲這是你需要的嗎? –