正则表达式中的\d和*问题。请帮忙,谢谢!

时间:2022-11-27 18:46:42
<?php
$str="radf243bd app***le";
ereg("(\d+)",$str,$tmp);
echo $tmp[1];
?>
竟然输出d,我的本意是要输出243。如果我改写成
<?php
$str="radf243bd app***le";
ereg("(\\d+)",$str,$tmp);
echo $tmp[1];
?>
同样也输出d。WHY???
还有
<?php
$str="radf243bd apple";
ereg("(p*)",$str,$tmp);
echo $tmp[1];
?>
竟然没有输出,为什么改写成:
<?php
$str="radf243bd apple";
ereg("(ap*)",$str,$tmp);
echo $tmp[1];
?>
才会输出app。

10 个解决方案

#1


竟然输出d,我的本意是要输出243。
(没用过php)加个@试试:
(@"(\d+)",$str,$tmp);

--------------------------------
竟然没有输出
p*:
*是0到多匹配,(这里的0你可以理解为NULL(一种“空“))
你的表达式radf243bd apple会从r开始一个字符一个字符匹配到e
也就是说,不是你得不到值,而是第一次得不到,得一个一个字符匹配到p才能得到
可以改为 P+ 即可,引擎会从第一个p开始得到匹配

--------------------------------------------------
才会输出app。
ap* 因为p前面的a并不在*的范围内,正则引擎会将之视为“普通文本”
    所以引擎会在第一个a的出现起开始匹配

#2


你使用的是POSIX风格的正则函数。其字符类形式为[:alnum:],[:alpha:] ...
而你使用的模式 \d 是兼容perl的字符类形式,此时你必须用perl_match 之类的兼容perl的正则函数。
有两种方法可以修改你的错误:
1)
ereg("([[:digit:]]+)",$str,$tmp); //ereg("([0-9]+)",$str,$tmp);

2)
用效率更高的perl_match()

#3


多谢楼上两位的解答,有没有关于解释正则原理的一些站点,对那个*还是有点疑惑。有谁能讲解的详细点吗?多谢多谢。

#4


帮顶,学习来了

#5


*是匹配零次或多次

#6


里面有你要的:
http://blog.csdn.net/deroshia/

#7



*是匹配零次或多次

#8


$str="radf2433d3bd app**443*le";
$rearray=array();
if(preg_match_all('/[\d]*/',$str,$match)){
if($match[0]){
foreach($match[0] as $value){
if($value){
$rearray[]=$value;
}
}
}
}
for($i=0;$i<count($rearray);$i++){
echo "第".($i+1)."个匹配项:".$rearray[$i]."<br />";
}

#9


php中的正则函数还是用preg开头的兼容perl的功能强大些

#10


*是匹配零次或多次这个我当然知道。但是就是这个零次上面出现了一些理解问题。所以想请教。不过刚过了年,已经是2007年。讨个好彩头,结贴了。

#1


竟然输出d,我的本意是要输出243。
(没用过php)加个@试试:
(@"(\d+)",$str,$tmp);

--------------------------------
竟然没有输出
p*:
*是0到多匹配,(这里的0你可以理解为NULL(一种“空“))
你的表达式radf243bd apple会从r开始一个字符一个字符匹配到e
也就是说,不是你得不到值,而是第一次得不到,得一个一个字符匹配到p才能得到
可以改为 P+ 即可,引擎会从第一个p开始得到匹配

--------------------------------------------------
才会输出app。
ap* 因为p前面的a并不在*的范围内,正则引擎会将之视为“普通文本”
    所以引擎会在第一个a的出现起开始匹配

#2


你使用的是POSIX风格的正则函数。其字符类形式为[:alnum:],[:alpha:] ...
而你使用的模式 \d 是兼容perl的字符类形式,此时你必须用perl_match 之类的兼容perl的正则函数。
有两种方法可以修改你的错误:
1)
ereg("([[:digit:]]+)",$str,$tmp); //ereg("([0-9]+)",$str,$tmp);

2)
用效率更高的perl_match()

#3


多谢楼上两位的解答,有没有关于解释正则原理的一些站点,对那个*还是有点疑惑。有谁能讲解的详细点吗?多谢多谢。

#4


帮顶,学习来了

#5


*是匹配零次或多次

#6


里面有你要的:
http://blog.csdn.net/deroshia/

#7



*是匹配零次或多次

#8


$str="radf2433d3bd app**443*le";
$rearray=array();
if(preg_match_all('/[\d]*/',$str,$match)){
if($match[0]){
foreach($match[0] as $value){
if($value){
$rearray[]=$value;
}
}
}
}
for($i=0;$i<count($rearray);$i++){
echo "第".($i+1)."个匹配项:".$rearray[$i]."<br />";
}

#9


php中的正则函数还是用preg开头的兼容perl的功能强大些

#10


*是匹配零次或多次这个我当然知道。但是就是这个零次上面出现了一些理解问题。所以想请教。不过刚过了年,已经是2007年。讨个好彩头,结贴了。