2015-11-20 5 views
0

Первоначально я разделил свой cf_replace() и внутренний цикл foreach() в другом .php-файле. Когда я запускал свой скрипт.php, который называл этот код, все было в порядке. Теперь, когда мне нужно объединить два сценария php в один, один из моих циклов foreach() не поддерживает функцию cf_replace внутри каталога и вместо этого выплескивает пустые файлы в мой текущий каталог! Я некоторое время смотрел на этот код и хотел бы получить свежий набор глаз.Почему моя строка foreach() возвращает файлы в мой текущий каталог?

$ip = $argv[1]; 

// Declare vars - e.g. $currentTime  
    $htmlDir = "app/HtmlPages/$ip" ."-". "$currentTime/$ip/index.php/art"; 
    ... 
    // Make the directory where the generated HTML files will go. 
    mkdir("app/HtmlPages/$ip" ."-". "$currentTime", 0777, false); 


    // Use wget to recurse over the entire website, downloading every webpage. 
    $wget_cmd = "wget -P app/HtmlPages/$ip"."-"."$currentTime/ \ 
     --recursive \ 
     --no-clobber \ 
     --domains $ip \ 
      http://$ip/index.php/art/art.htm"; 
exec ($wget_cmd); 
... 
// Iterate through each Html file in $htmlDir and replace with ColdFusion 
foreach(new DirectoryIterator($htmlDir) as $htm_file) 
{ 
    if($htm_file->isDot() || !$htm_file->isFile()) { 
     continue; 
    } 

    foreach(new DirectoryIterator ('./cf_templates/') as $cf_file) 
    { 
     // Checks for all files 
     if ($cf_file->isDot() || ! $cf_file->isFile()) { 
      continue; 
    } 

     // Grabs the template name and content to replace 
     $cf_name = $cf_file->getBasename($cf_file->getExtension()); 
     $cf_code = file_get_contents('./cf_templates/' . $cf_file); 

     cf_replace($cf_name, $cf_code, $htm_file); 

    } 

    echo "Finished replacing Html code in $htm_file.\r\n"; 

} 
... 

function cf_replace($name, $new_code, $source) { 
    $content = file_get_contents($source); 

    $start = preg_quote("<!-- $name COLDFUSION BEGIN -->" , "#"); 
    $end = preg_quote("<!-- $name COLDFUSION END -->", "#"); 

    $needle_search = '#($start)(.*?)($end)#si'; 
    $temp = preg_replace($needle_search, $new_code, $content); 
    $temp = file_put_contents($source, $temp); 

    return $temp; 
} 

Я думаю, что file_put_contents() в cf_replace() будет просто поместить файлы обратно в исходный файл - который хранится в том же каталоге, ... нет? Любая помощь приветствуется!

+0

К сожалению, сообщение об ошибке, я обычно получаю: 'PHP Warning: file_get_contents (test1.htm): не удалось открыть поток:' и 'Предупреждение: file_put_contents (app/HtmlPages/server.com-2015_11_20_11: 25: 33/server.com/index.php/art) ' – arl

+0

' DirectoryIterator' просто возвращает имена файлов, они не включают префикс каталога. При попытке доступа к файлам вам необходимо указать каталог. – Barmar

+0

также 'DirectoryIterator ('./cf_templates/')' будет относиться к вашему текущему рабочему каталогу, а не к каталогу '$ htm_file' или' $ htmlDir', если вы специально не измените каталог в своем скрипте. –

ответ

0

Имена, возвращаемые при переходе по итератору каталогов, не содержат имя каталога. Вам нужно добавить, что так называют

cf_replace($name, $cf_code, "$htmlDir/$htmFile"); 
+0

Спасибо, Бармар, за решение и объяснение. Это решило проблему! – arl

Смежные вопросы