php废弃函数ereg()eregi(),如何用preg_match()替换?
发布于 作者:苏南大叔 来源:程序如此灵动~苏南大叔来描述一下php
的两个废弃函数,ereg()
和eregi()
函数。这两个函数,存在于php@4
和php@5
系列中,在php@7
系列中,就会被提示函数不存在。那么,该使用什么函数进行替代呢?这个答案就是:preg_match()
。
本文测试环境:mac
,php@5.6
,php@7.3
。本文的实际存在意义是:在高版本php
中,实现对以往老代码的一个兼容处理。ereg()
、eregi()
、preg_match()
可以用于规则判断,类似于大家常写的是否是手机号之类的功能判断函数。
基本情况
ereg()
、eregi()
,可以使用preg_match()
来替代。对于php@5.6
,三个函数ereg()
、eregi()
、preg_match()
同时存在。但是对于ereg()
和eregi()
,会提示deprecated
。对于preg_match()
函数,不会有任何的错误提示。
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);
注意点二:返回值处理
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);
从结果中可以看到:如果匹配成功,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);
从运行结果中,可以看到:
- 当匹配失败的时候,
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);
相关链接
- https://www.php.net/manual/zh/function.ereg.php
- https://www.php.net/manual/zh/function.preg-match.php
总结
在本文中,苏南大叔仅仅描述的是:ereg()
、eregi()
转化成preg_match()
的变化基本套路。但是,并没有覆盖所有的情况,所以,大家请仅以此文作为参考即可。苏南大叔对正则表达式,也不在行,所以,不排除理解上有偏颇。所以,大家请根据实际情况进行修改。
更多php
相关博客文章,请点击苏南大叔的博客:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。