我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

苏南大叔来描述一下php的两个废弃函数,ereg()eregi()函数。这两个函数,存在于php@4php@5系列中,在php@7系列中,就会被提示函数不存在。那么,该使用什么函数进行替代呢?这个答案就是:preg_match()

苏南大叔:php废弃函数ereg()eregi(),如何用preg_match()替换? - php-ereg-hero
php废弃函数ereg()eregi(),如何用preg_match()替换?(图6-1)

本文测试环境:macphp@5.6php@7.3。本文的实际存在意义是:在高版本php中,实现对以往老代码的一个兼容处理。ereg()eregi()preg_match()可以用于规则判断,类似于大家常写的是否是手机号之类的功能判断函数。

基本情况

ereg()eregi(),可以使用preg_match()来替代。对于php@5.6,三个函数ereg()eregi()preg_match()同时存在。但是对于ereg()eregi(),会提示deprecated。对于preg_match()函数,不会有任何的错误提示。

苏南大叔:php废弃函数ereg()eregi(),如何用preg_match()替换? - compare-ereg
php废弃函数ereg()eregi(),如何用preg_match()替换?(图6-2)

ereg()eregi()preg_match(),三者基本上是类似的,必选的参数个数一致(可选参数可不一致),$pattern正则表达式部分有变化,返回值不同。

注意点一:$pattern参数变化

ereg()eregi()preg_match()三者,第一个参数都是$pattern,正则表达式。但是ereg()eregi()的表达式,并不是目前最流行的设定。在转到preg_match()后,需要做一定的修改才能使用正则。

ereg()eregi() ===> preg_match(),修改的基本规则如下:

  • 对于ereg()$pattern,两边加定界符/,需要转义处理特殊字符,
  • 对于eregi()$pattern,左边加定界符/,右边加定界符/i,需要转义处理特殊字符。
  • 定界符/可以变成定界符#,这个时候,就不用处理/字符的转义问题。
$str = "uncle sunan";
$result = ereg("^[' a-z]+$", $str, $arr);
$result2 = preg_match("/^[' a-z]+$/", $str, $arr);

$str = "http://newsn.net";
$result = ereg("^['a-z./:]+$", $str, $arr);
$result2 = preg_match("/^['a-z.\/:]+$/", $str, $arr);
$result2 = preg_match("#^['a-z./:]+$#", $str, $arr);

苏南大叔:php废弃函数ereg()eregi(),如何用preg_match()替换? - ereg-php-code
php废弃函数ereg()eregi(),如何用preg_match()替换?(图6-3)

注意点二:返回值处理

ereg()eregi()preg_match()的返回值不同,所以,需要特殊注意相关条件判断。

$str = "uncle sunan|";
$result = ereg("^[' a-z]+$", $str, $arr);
$result2 = preg_match("/^[' a-z]+$/", $str, $arr);
var_dump($result);
echo "<==>";
var_dump($result2);

$str = "http://newsn.net";
$result = ereg("^['a-z./:]+$", $str, $arr);
$result2 = preg_match("/^['a-z.\/:]+$/", $str, $arr);
//$result2 = preg_match("#^['a-z./:]+$#", $str, $arr);
var_dump($result);
echo "<==>";
var_dump($result2);

苏南大叔:php废弃函数ereg()eregi(),如何用preg_match()替换? - result_compare
php废弃函数ereg()eregi(),如何用preg_match()替换?(图6-4)

从结果中可以看到:如果匹配成功,ereg返回的是匹配的字符串长度,preg_match返回的是数字1。如果匹配不成功,ereg()返回的是布尔值false,而preg_match返回的是数字0.

注意点三:引用返回值不同

这三个函数,都有一个非常奇怪的引用型参数&$regs,位置是第三个参数坑位。在函数内部,对这个参数进行了修改。当然,苏南大叔认为他也是个返回值。例如:下面代码中的$arr参数。

$str = "uncle sunan|";
$result = ereg("^[' a-z]+$", $str, $arr);
$result2 = preg_match("/^[' a-z]+$/", $str, $arr2);
var_dump($arr);
echo "<==>";
var_dump($arr2);

$str = "http://newsn.net";
$result = ereg("^['a-z./:]+$", $str, $arr);
$result2 = preg_match("/^['a-z.\/:]+$/", $str, $arr2);
//$result2 = preg_match("#^['a-z./:]+$#", $str, $arr);
var_dump($arr);
echo "<==>";
var_dump($arr2);

苏南大叔:php废弃函数ereg()eregi(),如何用preg_match()替换? - result_compare_2
php废弃函数ereg()eregi(),如何用preg_match()替换?(图6-5)

从运行结果中,可以看到:

  • 当匹配失败的时候,ereg()eregi()的引用参数返回的是NULL。而preg_match()返回的是个空数组。
  • 当匹配成功的时候,三者返回值一致,都是一个普通的一维数组。

定界符/,#

为了规避$pattern中的特殊字符,可以通过转化定界符的方式,进行规避。目前已知的定界符有:/#@|等。下面的是相关测试代码:

$str = "http://newsn.net";
$result = ereg("^['a-z./:]+$", $str, $arr);
$result = preg_match("/^['a-z.\/:]+$/", $str, $arr);
$result2 = preg_match("#^['a-z./:]+$#", $str, $arr2);
$result3 = preg_match("@^['a-z./:]+$@", $str, $arr3);
$result4 = preg_match("|^['a-z./:]+$|", $str, $arr4);

苏南大叔:php废弃函数ereg()eregi(),如何用preg_match()替换? - bundary_flag
php废弃函数ereg()eregi(),如何用preg_match()替换?(图6-6)

相关链接

总结

在本文中,苏南大叔仅仅描述的是:ereg()eregi()转化成preg_match()的变化基本套路。但是,并没有覆盖所有的情况,所以,大家请仅以此文作为参考即可。苏南大叔对正则表达式,也不在行,所以,不排除理解上有偏颇。所以,大家请根据实际情况进行修改。

更多php相关博客文章,请点击苏南大叔的博客:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php