<?php
### Requirements ###
/*
* Replace
* <a style="font-size: 13px;" href="url">
* with
* <a onclick="location.href='url';">
*/
### The following are test samples ###
#$string = '<a href="featuredwines.php">';
#$string = '<a style="font-size: 13px;" href="bookmarks.php?id=0000000113&add=0000000113&main=1&varietal=&chi=&vhi="';
#$string = '<a href="wine.php?id=0000000234&main=1&varietal=&chi=&vhi=&whi="';
#$string = "<a href='main.php?main=2&pricelist=1&sml='";
$string = '<a href="wine.php?id=0000000196&main=1&varietal=&chi=&vhi=&whi=&pri="';
#$pattern = '/(\<a href=")(.*?)(")/i';
##same
#$pattern = "/(\<a)(.*?)(href=\")(.*?)(\"|')/i";
##good one
#$pattern = '/(\<a)(.*?)(href="|\')(.*?)["|\']/i';
#$pattern = '/(<a)(.*?)(href=\'|")(.*?)("|\')/i';
$pattern = '/(<a)(.*?)(href=[\'"])(.*?)([\'"])/i';
#$replacement = '<a onclick="location.href=\'$2\';"';
$replacement = '<a$2onclick="location.href=\'$4\';"';
echo preg_replace($pattern, $replacement, $string);
?>
PHP CLI: Recursive Search and Replace
<?php
//=== Recursive File Search and replace ==========================================
// Inputs: $start_dir Absolute or relative path to starting folder. Do not
// include a forward slash at the end. c:/test ./test
// $file_type A regex patern containg file types to be searched
// e.g. $file_type = '/(\.txt|\.cnf|\.conf)/'
// $search_str A regex patern e.g $search_str = '/\nListen\s\d+/'
// $replace_str A plain text string e.g. $replace_str = "\nListen 8080"
//
// Output: Returns true --- Need to add error checking
//
// Notes : Searches for files of the specified type starting at $start_dir and
// incluse all sub-folders. Each file found a search and replace is
// performed.
//
// -----------------------------------------------------------------------------------
function file_sr_global($start_dir,$file_type,$search_str,$replace_str){
$dirlist = opendir($start_dir); // Open start directory
while ($file = readdir($dirlist)){ // Iterate through list
if ($file != '.' && $file != '..'){ // Skip if . or ..
$newpath = $start_dir.'/'.$file; // Create path. Either dir or file
if (is_dir($newpath)){ // Is it a folder
// yes: Repeat this function
file_sr_global($newpath,$file_type,$search_str,$replace_str);
} // for that new folder
else{ // no: Its a file
if (preg_match($file_type, $newpath)){ // Filter by file extension.
$fh = fopen($newpath, 'r'); // Open file for read
$Data = fread($fh, filesize($newpath)); // Read all data into variable
fclose($fh); // Close file handle
$Data = preg_replace($search_str, $replace_str, $Data,-1,$count);// S & R
if($count){ // Was a replacement made
$fh = fopen($newpath, 'w'); // yes: Open file for write
fwrite($fh, $Data); // Write new $Data to file
fclose($fh); // Close file handle
echo $newpath." Replaced ".$count."\n"; //***** Delete this line *******
}
}
}//eof else
}
}//eof while
closedir($dirlist); // Close handle
return true; // Return
}
//=================================== END Recursive File Search and replace ======
$start_dir = '/home/searchandreplace/mark'; // Start folder
$file_type = '/(\.txt|\.php|\.conf)/'; // Filter, required files
#$search_str = '/(\<a)(.*?)(href=")(.*?)("|')/i';
#$search_str = '/(\<a)(.*?)(href="|\')(.*?)("|\')/i';
#$search_str = '/(<a)(.*?)(href=[\'"])(.*?)("|\')/i';
/*
* Each (parameter) is a subpattern, each pattern will be replaced by the
* $replacement counterpart($1,$2...etc).
* Leave $2 and $4 intact
* #[\'"] present the OR, couldn't get (\'|") to work???
*/
$search_str = '/(<a)(.*?)(href=[\'"])(.*?)([\'"])/i';
$replace_str = '<a$2onclick="location.href=\'$4\';"';
if(file_sr_global($start_dir,$file_type,$search_str,$replace_str)){
echo "\n Search and replace complete\n";
}
exit(0);
?>
REFERENCES
http://ca3.php.net/manual/en/function.preg-replace.php
http://ca3.php.net/manual/en/reference.pcre.pattern.modifiers.php
http://wiki.uniformserver.com/index.php/PHP_CLI:_Recursive_Search_and_Replace
http://hubpages.com/hub/Regex-SubPattern-in-PHP
http://beaver6813.com/2010/04/php-search-and-replace-directory-recursively/
http://darcyclarke.me/development/php-recursive-find-and-replace/
