Saturday, December 3, 2011

How to change PHP's eregi to preg_match

This function eregi has been DEPRECATED as of PHP 5.3.0. Relying on this feature is highly discouraged.

Now what we need is to replace the eregi functions used in our old applications with some new functions that are still not depreciated...
First i will describe functionality of eregi() and then i will go for appropriate function to replace it.

eregi — Case insensitive regular expression match

int eregi ( string $pattern , string $string [, array &$regs ] )

This function is identical to ereg() except that it ignores case distinction when matching alphabetic characters.


Case insensitive regular expression.
The input string.
If matches are found for parenthesized substrings of pattern and the function is called with the third argument regs, the matches will be stored in the elements of the array regs.
$regs[1] will contain the substring which starts at the first left parenthesis; $regs[2] will contain the substring starting at the second, and so on. $regs[0] will contain a copy of the complete string matched.

return Values

Returns the length of the matched string if a match for pattern was found in string, or FALSE if no matches were found or an error occurred.
If the optional parameter regs was not passed or the length of the matched string is 0, this function returns 1.

A good alternative is to use preg_match() function

Now lets talk about preg_match

preg_match — Perform a regular expression match


int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int$offset = 0 ]]] )
Searches subject for a match to the regular expression given in pattern.

More details can be found at php.net http://in2.php.net/manual/en/function.preg-match.php

Now How to replace eregi with preg_match

You will need to change three things
  1. need to add pattern delimiters (can be any character, but most commonly a forward slash)
  2. [[:alnum:]] will need to be replaced with the PCRE equivalent
  3. The "i" in "eregi" means case-insensitive, which PCRE does with a flag, specifically the i flag.
Otherwise, the rest looks PCRE compatible (yes, that's kind of redundant =P)


  1. If I have a function like this: eregi($regex, $url). How do I convert it to preg_match?

    1. Its explained above. To make it simple
      1. Replace the pattern like [[:alnum:]] with PCRE equivalent(Eg: [a-z0-9])
      2. Add pattern delimiters to the pattern you are using
      3. Add "i" after the pattern delimiter to make it case insensitive
      4. Now make it preg_match($regex, $url)