0

特定のファイルをプルするための特別なincludeステートメントのテキストを解析しようとしています。

私は次の機能を持っています:

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 parse_includes($text);

このエラーが発生します:

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

が1つしかない場合は[include: *'、期待どおりに機能します。

正規表現を変更するにはどうすればよいですか?HTMLまたは空白が両側の角かっこをどのように囲むことができるかに注意してください。

4

1 に答える 1

1

正規表現はデフォルトで貪欲です。つまり、できるだけ多くの文字に一致させようとします。結局のところ、これは次の文字列と([^,]+)一致します。

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

relucant を使用するように正規表現を変更できます+

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

これにより、可能な限り一致するのではなく、可能な限り一致しなくなります。または、一致した文字列で左ブラケットを許可しないようにすることもできます。

preg_match_all('/\[include:([^,[]+)\]/', $text, $matches);
于 2012-10-10T20:05:55.660 に答える