I’ve written a shell script to bulk update PHP pages, replacing ereg, eregi with preg_match, ereg_match with preg_match, split with preg_split and changing the $HTTP globals to their modern versions. I haven’t seen this anywhere else, so I’d thought I should post something here.
#!/bin/sh
################################################################
# #
# FIX DEPRECATED PHP FUNCTIONS #
# #
# Coded by Noah Hearle, Design Extreme #
# http://designextreme.com #
# With thanks to: Peter Bowey, pbcomp.com.au #
# #
# Created: 2015/02/27 #
# Modified: 2015/06/26 #
# #
# Change old PHP functions to their modern equivalent #
# #
# ereg() => preg_match() #
# ereg_replace() => preg_replace() #
# split() => preg_split() #
# mysql_escape_string() => mysql_real_escape_string() #
# $HTTP_GET_VARS[] => $_GET[] #
# $HTTP_POST_VARS[] => $_POST[] #
# $HTTP_REQUEST_VARS[] => $_REQUEST[] #
# $HTTP_SESSION_VARS[] => $_SESSION[] #
# $HTTP_COOKIE_VARS[] => $_COOKIE[] #
# $HTTP_SERVER_VARS[] => $_SERVER[] #
# $HTTP_POST_FILES[] => $_FILES[] #
# #
# Post your comments at: #
# https://blog.nahoo.co.uk/bulk-update-scripts-to-php-5-4/ #
# #
# Usage: sh ./php_update.sh <directory> #
# #
################################################################
directory="$@"
if [ ! -n "$directory" ]; then
echo "ERROR: Missing target PHP directory.";
else
for file in $(find $directory -type f \( -name "*.php" -o -name "*.inc" -o -name "*.install" -o -name "*.module" -o -name "*.html" \));
do
file_check=$(grep -El "([^_]eregi?(_replace)?[(]|[^_.]split[(]|mysql_escape_string[(]|\\\$HTTP_(POST_FILES|((GET|POST|REQUEST|SESSION|COOKIE|SERVER|ENV)_VARS)))" "$file");
if [ -n "$file_check" ]; then
perl -pi -e "s@\\\$HTTP_(GET|POST|REQUEST|SESSION|COOKIE|SERVER|ENV)_VARS@\\\$_\1@g" $file;
perl -pi -e "s@\\\$HTTP_POST_(FILES)@\\\$_\1@g" $file;
perl -pi -e "s@([^_])ereg(i?)\(['\"]([^\/'\"]*)['\"], ?@\1preg_match('\/\3\/\2', @g" $file;
perl -pi -e "s@([^_])ereg(i?)\(['\"]([^#'\"]*)['\"], ?@\1preg_match('#\3#\2', @g" $file;
perl -pi -e "s@([^_])ereg(i?)\(['\"]([^~'\"]*)['\"], ?@\1preg_match('~\3~\2', @g" $file;
perl -pi -e "s@([^_])ereg(i?)\([\"]([^\/]*)[\"], ?@\1preg_match(\"\/\3\/\2\", @g" $file;
perl -pi -e "s@([^_])ereg(i?)\((\\\$[^\\\$,]+)([^)+])@\1preg_match('\/'.preg_quote(\3, '\/').'\/\2'\4@g" $file;
perl -pi -e "s@([^_])ereg(i?)_replace\(['\"]([^\/'\"]*?)['\"], ?@\1preg_replace('\/\3\/\2', @g" $file;
perl -pi -e "s@([^_])ereg(i?)_replace\(['\"]([^#'\"]*?)['\"], ?@\1preg_replace('#\3#\2', @g" $file;
perl -pi -e "s@([^_])ereg(i?)_replace\(['\"]([^~'\"]*?)['\"], ?@\1preg_replace('~\3~\2', @g" $file;
perl -pi -e "s@([^_])ereg(i?)_replace\([\"]([^\/]*?)[\"], ?@\1preg_replace("\/\3\/\2", @g" $file;
perl -pi -e "s@([^_])ereg(i?)_replace\((\\\$[^\\\$,]+)([^)+])@\1preg_replace('\/'.preg_quote(\3, '\/').'\/\2'\4@g" $file;
perl -pi -e "s@([^_.])(split)\(['\"]([^/'\"]*)['\"], ?@\1preg_\2('/\3/\',@g" $file;
perl -pi -e "s@([^_.])(split)\(['\"]([^#'\"]*)['\"], ?@\1preg_\2('#\3#\',@g" $file;
perl -pi -e "s@([^_.])(split)\(['\"]([^~'\"]*)['\"], ?@\1preg_\2('~\3~\',@g" $file;
perl -pi -e "s@(mysql_)(escape_string)\(@\1real_\2(@g" $file;
file_check_check=$(grep -El "([^_]eregi?(_replace)?[(]|[^_.]split[(]|\\\$HTTP_(POST_FILES|((GET|POST|REQUEST|SESSION|COOKIE|SERVER|ENV)_VARS)))" "$file");
if [ -n "$file_check_check" ]; then
echo "Incomplete update of file: $file";
else
echo "Successfully updated file: $file";
fi
fi
done;
fiSave this as a bash file (e.g. php_update.sh) and run using: sh php_update.sh /home/user/directory. And, always backup your site first, it only takes seconds!
If you’ve used this script on your server, please write a comment here.
Last updated on


Many thanks for this great script: “Bulk update scripts to PHP 5.4”
I have made some changes (and tested them):
1) Cleaned / corrected some Perl Regular Expression errors with missing escapes on “/” regex.
2) Allowed the script to work against a CLI specified directory (recursive).
3) Stop the script from modifying “inline” JavaScript use of typical “..).split()” functions.
4) Stop the script from modifying those CMS’s that employ replacement PHP functions() for backward compatibility (Joomla is one such beast).
#!/bin/bash
#
# Peter: Fix old PHP scripts to their modern equivalent
# Usage: ./update-php
#
# Script to bulk update older PHP pages, replacing; ereg + eregi with preg_match, ereg_match with preg_match, split with preg_split and chang the $HTTP globals to their modern versions
# Notes: regex = [^_.] stop changing inline javascript use of ).split()
directory=”$@”
if [ ! -n “$directory” ]; then
echo “ERROR: Missing target PHP directory.”;
else
for file in $(find $directory -type f \( -name “*.php” -o -name “*.inc” -o -name “*.install” -o -name “*.module” -o -name “*.html” \));
do
file_check=$(grep -El “([^_]eregi?(_replace)?[(]|[^_.]split[(]|\\\$HTTP_(POST_FILES|((GET|POST|REQUEST|SESSION|COOKIE|SERVER|ENV)_VARS)))” “$file”);
if [ -n “$file_check” ]; then
echo “Updating File: $file”;
perl -pi -e “s@([^_])ereg(i?)\([‘\”]([^\/’\”]*)[‘\”], ?@\1preg_match(‘\/\3\/\2’, @g” $file;
perl -pi -e “s@([^_])ereg(i?)\([‘\”]([^#’\”]*)[‘\”], ?@\1preg_match(‘#\3#\2’, @g” $file;
perl -pi -e “s@([^_])ereg(i?)\([‘\”]([^~’\”]*)[‘\”], ?@\1preg_match(‘~\3~\2’, @g” $file;
perl -pi -e “s@([^_])ereg(i?)\([\”]([^\/]*)[\”], ?@\1preg_match(\”\/\3\/\2\”, @g” $file;
perl -pi -e “s@([^_])ereg(i?)\((\\\$[^\\\$,]+)([^)+])@\1preg_match(‘\/’.preg_quote(\3, ‘\/’).’\/\2’\4@g” $file;
perl -pi -e “s@([^_])ereg(i?)_replace\([‘\”]([^\/’\”]*?)[‘\”], ?@\1preg_replace(‘\/\3\/\2’, @g” $file;
perl -pi -e “s@([^_])ereg(i?)_replace\([‘\”]([^#’\”]*?)[‘\”], ?@\1preg_replace(‘#\3#\2’, @g” $file;
perl -pi -e “s@([^_])ereg(i?)_replace\([‘\”]([^~’\”]*?)[‘\”], ?@\1preg_replace(‘~\3~\2’, @g” $file;
perl -pi -e “s@([^_])ereg(i?)_replace\([\”]([^\/]*?)[\”], ?@\1preg_replace(“\/\3\/\2″, @g” $file;
perl -pi -e “s@([^_])ereg(i?)_replace\((\\\$[^\\\$,]+)([^)+])@\1preg_replace(‘\/’.preg_quote(\3, ‘\/’).’\/\2’\4@g” $file;
perl -pi -e “s@\\\$HTTP_POST_(FILES)@\\\$_\1@g” $file;
perl -pi -e “s@\\\$HTTP_(GET|POST|REQUEST|SESSION|COOKIE|SERVER|ENV)_VARS@\\\$_\1@g” $file;
perl -pi -e “s@([^_.])(split)\([‘\”]([^\/’\”]*)[‘\”], ?@\1preg_\2(‘\/\3\/\’, @g” $file;
perl -pi -e “s@([^_.])(split)\([‘\”]([^#’\”]*)[‘\”], ?@\1preg_\2(‘#\3#\’, @g” $file;
perl -pi -e “s@([^_.])(split)\([‘\”]([^~’\”]*)[‘\”], ?@\1preg_\2(‘~\3~\’, @g” $file;
fi
done;
fi
Thank you Peter! I have checked your code and integrated this into the existing script. I’ve also added a much needed check of the file’s status after the file modification – to see if the old functions have been replaced successfully.
I’ve created a new version of this script to update PHP files to version 7: https://blog.nahoo.co.uk/migrate-from-php-5-7/