ahmed786 Posted April 20, 2010 Share Posted April 20, 2010 Hello, I am a new in PHP:-(. I need help with this task. I want to change ../default/test.png -> /image/default/test.png relative path to ansolute. this is my script please have a look. <?php /** * A small example file to find images that are referenced in template * files, but not exists in the file system * * @author Leander Hanwald */ error_reporting(E_ALL); /** * Scans the given directory for all available designs * * @param String $designDirectory root directory of the designs * @return Array list of designs found */ function getDesignList($designDirectory) { $result = array(); $d = dir($designDirectory); while (false !== ($entry = $d->read())) if ($entry != '..' && $entry != '.' && is_dir($designDirectory.$entry)) $result[] = $entry; return $result; } /** * Returns a list of templates for the given design. If the design is not the * default design, this design is also scaned, the result list is a mix of * files from both directories (specific design "overwritted" default design) * * @param String $designDirectory root directory of the designs * @param String $designName name of the current design to scan * @param Array $ignoreDirectories list of directories not to scan * @return Array list of templates found in design (and default design) */ function getTemplates($designDirectory, $designName, $ignoreDirectories = array()) { /* if this is not the default design, we start with all files inside of the default design as start array. Our new design will only overwrite these entries. */ $result = array(); if ($designName != 'default') $result = getTemplates($designDirectory, 'default', $ignoreDirectories); $result = _scanDirectory('', $designDirectory.$designName.'/', $ignoreDirectories, $result); return $result; } /** * Scans a given directory recursive and extends the given data array with the * found template files. Works relative to a given root directory. * * @param String $directory path relative to root of current dir to scan * @param String $root base dir to scan (design directory) * @param Array $ignoreDirectories list of directories not to scan * @param Array $data extend with the new found templates return true; * @return array known and new found templates, key is the relative name to root, value the full filename */ function _scanDirectory($directory, $root, $ignoreDirectories, &$data) { if (in_array($directory, $ignoreDirectories)) return $data; $d = dir($root.$directory); while (false !== ($entry = $d->read())) { if ($entry == '..' || $entry == '.') continue; if (is_dir($root.$directory.$entry)) $data = _scanDirectory($directory.$entry.'/', $root, $ignoreDirectories, $data); $info = pathinfo($root.$directory.$entry); $lookup = array('html', 'css'); if (is_file($root.$directory.$entry) && in_array($info['extension'], $lookup)) $data[$directory.$entry] = $root.$directory.$entry; } return $data; } /** * Trys to find images reference in the given templates, that do not exists * in the image directory (also given als parameter) * * @param String $imageDirectory root directory of the images of designs * @param String $designName name of the current design, needed for replace * variables like {$designName} in the templates. * @param Array $templates list of templates to search for missing images * @return Array list of images that are reference but not exists */ function findMissingImages($imageDirectory, $designName, $templates) { $result = array(); foreach ($templates as $template) { $rs = findMissingImagesInTemplate($imageDirectory, $designName, $template); $result = array_merge($rs, $result); } return $result; } /** * Scans a single template for missing images * * @param String $imageDirectory root directory of the images of designs * @param String $designName name of the current design, needed for replace * variables like {$designName} in the templates. * @param $templateFullFileName complete path to the template to scan * @return Array list of images that are reference but not exists in this * template */ function findMissingImagesInTemplate($imageDirectory, $designName, $templateFullFileName) { /* TODO 1: Find images in templates*/ $result = array(); $handle = @fopen($templateFullFileName, "r"); while (!feof($handle)) { $buffer = fgets($handle); $matching = str_replace('{$designName}', $designName, $buffer); $pattern1 = '/"background-image:+\s*[\(a-z]*+(\s*([\/a-z0-9]*+[\.]*? (jpg|png)))/'; $pattern2 = '/([\""\'])*((([^\.\$\: ]*\.)*?(jpg|png)))\1/i'; preg_match_all($pattern1, $matching, $matches1); preg_match_all($pattern2, $matching, $matches2); $matches = array_merge($matches2[0], $matches1[1]); foreach ($matches as $match) { $match = str_replace(array('"', '\'', '(', ')'), "", $match); $result[] = $match; } } fclose($handle); /* TODO 2: Test if images exists via function "imageExists" */ foreach ($result as $imageUrl) $result[] = imageExists($imageDirectory, $imageUrl, $templateFullFileName) === True; print_r($result); return $result; } /** * Checks if an image, given as url, exists in filesystem. * * It is a not so simple task to check if an image found in the template really * exists in the filesystem. Sometimes the urls contains relative pathes like * ../default/counter/object.png, or started with an slash (/) or are relative * at all (a template tries to use a image in the same folder). * * To handle this logic, we use an own function to lookup a single file from a * url in the image directory given as parameter to this function. * * @param String $imageDirectory root directory of the images of designs * @param String $imageUrl url of an image, found in a template * @param $templateFullFileName complete path to the template, could be needed * in cases of relative image pathes * @return Boolean true if image exists, false if not */ function imageExists($imageDirectory, $imageUrl, $templateFullFileName) { /* TODO 4: check if image url is relative, if yes make it absolute * like: ../default/test.png -> /image/default/test.png */ /* Check if url is relative and resolve it from templateFullFileName */ $absolute = ""; if(preg_match('=^\/=',$imageUrl)) { $absolute = $imageUrl; } $relative = ""; if (!preg_match('=^\/=', $imageUrl)) { $templateFullPath = dirname($templateFullFileName); $relative = $templateFullPath."/".basename($imageUrl); } $imageUrlAbsPath = $absolute.$relative; /* TODO 5: Check if image in filesystem exist, AND if it is really an image */ $imageDirPath = $imageDirectory."default/".basename($imageUrl); if(file_exists($imageDirPath)) { return true; } else { return false; } } /* Settings */ $designDirectory = '/home/domainusers/m.mujtaba/workspace/picfinder/html/'; $imageDirectory = '/home/domainusers/m.mujtaba/workspace/picfinder/image/'; /* a lot of directories are not needed in our search, so we ignore them here*/ $ignoreDirectories = array('other/xinha_update/', 'website/themes/', 'other/xinha/', 'ecatalog/victorobjectedit/'); /* main */ echo("\nStart finding of missing images...\n"); $designList = getDesignList($designDirectory); $missingImages = array(); foreach ($designList as $designName) { echo(sprintf("Scan design '%s' \n", $designName)); $templates = getTemplates($designDirectory, $designName, $ignoreDirectories); $missingImagesInTemplate = findMissingImages($imageDirectory, $designName, $templates); //print_r($missingImagesInTemplate); /* TODO 6: Join $missingImages and $missingImagesInTemplate, bit in a way that it is possi*ble to see in which template a file was referenced. Example result after the join ( print_() output ) : array ( '/image/default/test.png' => array( [0] => 'default/counter/startpage.html' [0] => 'default/counter/info.html' ) ) the list of templates for an image is multi dimensional because it is possible that different template reference the same - missing - image. */ } print_r($missingImages); Any help will be appreciated. Thank u Link to comment https://forums.phpfreaks.com/topic/199133-php-function/ Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.