如何用不同的替换文本替换preg_match匹配的多个实例?

时间:2013-04-05 18:04:39

标签: php preg-replace preg-match

我有一个脚本,用户通过文本输入运行,并用html替换标签中包含的文本。它大部分工作正常,但其中一个标签给我带来了麻烦。

[include = someFile.php]应该将someFile.php的内容加载到页面中,[inlude = thatFile.txt]应该加载thatFile.txt。但是,当include标记有多个实例时,每个实例都引用不同的文件,它只用一个包含的文件替换它们。我正在使用的代码是......

if (preg_match ("/\[include=(.+?)\]/", $text, $matches)) {
  foreach ($matches as $match) {
    $match = preg_replace("/\[include=/", "", $match);
    $match = preg_replace("/\]/", "", $match);
    $include = $match;
    $file_contents = file_get_contents($include);
    $text = preg_replace("/\[include=(.+?)\]/", "$file_contents", $text);
  }
}

foreach循环的最后一行似乎是用当前标记中找到的任何内容替换匹配标记的每个实例,但我不知道如何处理它。任何建议表示赞赏!

编辑:感谢Uby,我做了以下更改,现在可以使用了。

if (preg_match_all ("/\[include=(.+?)\]/", $text, $matches)) {

    foreach ($matches[0] as $match) {
        $file = preg_replace("/\[include=/", "", $match);
        $file = preg_replace("/\]/", "", $file);
        $file_contents = file_get_contents($file);
        $text = str_replace("$match", "$file_contents", $text);
    }

}

1 个答案:

答案 0 :(得分:0)

preg_match()只匹配一次,在您的情况下,您应该使用preg_match_all()(请参阅文档http://php.net/manual/en/function.preg-match-all.php

仔细阅读文档,你的循环不会像这样工作。