2014-02-14 88 views
0

我试图从其他文件的内容替换一些标签的内容包括文件中使用回用file_exists引用:PHP - 中的preg_replace

$view = preg_replace('/{include ([[:alnum:]\.-]+)}/', ((file_exists('template/$1.html')) ? 'OK $1' : 'KO $1'), file_get_contents('myTemplateFile.tpl')); 

所有{include file.ext}引用我在myTemplateFile.tpl了被替换KO file.ext代替的OK file.ext

不过,如果我硬编码file_exists('template/file.ext'),则显示正确的字符串。

在我看来后面引用不正确解决file_exists调用中。

我在做什么错?

$contents = file_get_contents('myTemplateFile.tpl'); 

if ((file_exists('template/$1.html')) { 
    $result = preg_replace('/{include ([[:alnum:]\.-]+)}/', 'OK $1', $contents); 
} else { 
    $result = preg_replace('/{include ([[:alnum:]\.-]+)}/', 'KO $1', $contents); 
} 

正如你所看到的,file_exists()呼叫的preg_replace()语句之前进行

回答

1
preg_replace('/{include ([[:alnum:]\.-]+)}/', ((file_exists('template/$1.html')) ? 'OK $1' : 'KO $1'), file_get_contents('myTemplateFile.tpl')) 

该第一执行file_exists('template/$1.html'),然后传递OK $1KO $1(可能是后者)到preg_replace,其然后替换所有的事件。

你必须使用一个回调来完成这项工作,不叫file_exists作为参数:

preg_replace_callback(
    '/{include ([[:alnum:]\.-]+)}/', 
    function (array $m) { 
     return file_exists("template/$m[1].html") ? "OK $m[1]" : "KO $m[1]"; 
    }, 
    file_get_contents('myTemplateFile.tpl') 
) 
+0

谢谢!我没有注意递归调用的解决方式......当然,在preg_replace甚至被评估之前,file_exists被首先调用! –

1
$view = preg_replace(
    '/{include ([[:alnum:]\.-]+)}/', 
    ((file_exists('template/$1.html')) ? 'OK $1' : 'KO $1'), 
    file_get_contents('myTemplateFile.tpl') 
); 

上述代码的执行过程如下。它正在检查该文件"template/$1.html",其中$1是不具有特殊的意义一个字符串的存在。该文件不存在,并且else块(原始为'KO $1')将始终执行。

总之,您不能使用preg_replace()函数以外的反向引用preg_replace()函数。解决的办法是preg_replace_callback()

preg_replace_callback(
    '/{include ([[:alnum:]\.-]+)}/', 
    function ($m) { 
     return file_exists('template/'.$m[1].'html') ? 'OK '.$m[1]: 'KO '.$m[1]; 
    }, 
    file_get_contents('myTemplateFile.tpl') 
); 

参见:

+0

感谢您的帮助,虽然你是第二...给了一个+1反正作为奖励; o) –

+0

我的不好。然而,另一个答案一步一步解释问题来自哪里,帮助我记住递归的东西是如何处理的。 :oP我希望你对我仍然不会有第二感受...... o) –