preg_replace to clean my image filenames

410 views Asked by At

I'll get right into it....

I have a problem with my ajax livesearch, using xml for a kind of inventory image search function, the code sees the image filenames imported into an xml file for use in the livesearch, however, image filenames with some special characters like a "-" is causing the livesearch to not work. I have provided the code below...

What I would like to do is code in a preg_replace to clean the filenames of these types of special characters, ideally use only letters, numbers, periods and the dollar sign. I'm not sure if it is wise to clean the filenames before they get imported to the xml file or clean them afterwards? Any help is appreciated, thx.

<?php

$path_to_image_dir = 'images'; // relative path to your image directory


$xml_string = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<images> 
</images>
XML;

$xml_generator = new SimpleXMLElement($xml_string);

$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path_to_image_dir));
foreach($it as $path => $file) {
    if($file->isDir()) continue; // skip folders
    list( $width, $height ) = getimagesize($path);
    $image = $xml_generator->addChild('image');
    $image->addChild('path', $path);
    $image->addChild('thumbnail', "<img src='$path' />");
}

$file = fopen('data.xml','w');
fwrite($file, $xml_generator->asXML());
fclose($file);?>

<!-- php code for initiating instant search of xml data file -->

<?php
$xmlDoc=new DOMDocument();
$xmlDoc->load("data.xml");

$x=$xmlDoc->getElementsByTagName('image'); //used to be link, now image, could be images

//get the q parameter from URL
$q=$_GET["q"];


//lookup all links from the xml file if length of q>0
if (strlen($q)>0) {
  $hint="";
  for($i=0; $i<($x->length); $i++) {

    $y=$x->item($i)->getElementsByTagName('path');
    $z=$x->item($i)->getElementsByTagName('thumbnail');
    $w=$x->item($i)->getElementsByTagName('image');
    if ($y->item(0)->nodeType==1) {
      //find a link matching the search text
      if (stristr($y->item(0)->childNodes->item(0)->nodeValue,$q)) {
        if ($hint=="") {
           $hint="<a style='font: bold 16px/18px century gothic, serif;' href=' 
           ".$y->item(0)->childNodes->item(0)->nodeValue."' target='_blank'>
           ".$y->item(0)->childNodes->item(0)->nodeValue."<br>
           ".$z->item(0)->childNodes->item(0)->nodeValue." <br><br>
        ";
        }
      else
        {
         $hint=$hint ."<a style='font: bold 16px/18px century gothic, serif;' href=' 
         ".$y->item(0)->childNodes->item(0)->nodeValue."' target='_blank'>
         ".$y->item(0)->childNodes->item(0)->nodeValue."<br>
         ".$z->item(0)->childNodes->item(0)->nodeValue." <br><br>
        ";
        }
      }
    }
  }
}

// Set output to "no suggestion" if no hint were found
// or to the correct values
if ($hint=="") {
  $response="Search found ' 0 ' matches";
} else {

  $response=$hint;
}

//output the response
echo $response;
?>

I tried adding this to clean the filenames but it didn't work:

function clean($string) {
   $string = str_replace('-', 'test', $string); 

   return preg_replace('/[^A-Za-z0-9\-]/', '', $string); 
}

// and then change the echo to this... (but didn't work as I planned,

echo clean ($response);
1

There are 1 answers

5
AnchovyLegend On

This can be accomplished with str_replace():

function clean($string) {
    $forbidden = array('-','#', ',');
    $clean = str_replace($forbidden, '_', $string);

   return $clean; 
}

To Implement:

   echo clean('test-img-101.png'); //outputs test_img_101.png