2012-10-10 113 views
0

我想解析文本的特殊包含語句拉特定的文件。如何獲得多個匹配正則表達式

我有以下功能:

function parse_includes($text, $directory = 'includes/') { 
preg_match_all('/\[include:([^,]+)\]/', $text, $matches); 

foreach($matches[1] as $key => $filename) { 
    ob_start(); 
    include($directory.$filename); 
    $include = ob_get_contents(); 
    ob_end_clean(); 
    $text = str_replace($matches[0][$key], $include, $text); 
} 

return $text; 

}

在傳遞這個變量:

$text = 'Below is the footer<br><br>[include:sidebar.php] <br><br> [include:footer.php]<br>'; 

而且echo'ing它:

echo parse_includes($text); 

我得到這個錯誤:

Warning: include(includes/sidebar.php] <br><br> [include:footer.php) [function.include]: failed to open stream: 

如果只有一個[include: *',它按預期工作。

我該如何修改我的REGEX?請注意,HTML或空白區域可以圍繞兩側的括號。

+0

您應該限制文件名模式'[^,] +'more。要麼使它不那麼貪婪,要麼不允許你在'''偶然發現的那個角色。 – mario

+0

你能給我舉個例子嗎? – AVProgrammer

回答

1

默認情況下正則表達式爲貪婪,這意味着它們嘗試匹配儘可能多的字符。事實證明,這([^,]+)匹配字符串:

sidebar.php] <br><br> [include:footer.php 

你可以改變你的正則表達式使用relucant+

preg_match_all('/\[include:([^,]+?)\]/', $text, $matches); 

這將導致它來搭配儘量少,不越多越好。或者,您可以禁止匹配字符串中的開頭括號:

preg_match_all('/\[include:([^,[]+)\]/', $text, $matches); 
+0

謝謝Jakub,我需要的只是? – AVProgrammer