2014-02-14 5 views
0

Я пытаюсь заменить содержимое некоторых тегов в включаемых файлах с содержимым из других файлов:PHP - Использование обратных ссылок с file_exists в 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.

Что я делаю неправильно?

ответ

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 $1 или KO $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

Спасибо! Я не обращал внимания на то, как рекурсивные вызовы были решены ... Конечно, file_exists вызывается первым, прежде чем preg_replace даже оценивается! –

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

Приведенный выше код выполняется следующим образом:

$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() заявление. Он проверяет наличие файла "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) –