$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的出现起开始匹配
(没用过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()
而你使用的模式 \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/
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 />";
}
$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的出现起开始匹配
(没用过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()
而你使用的模式 \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/
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 />";
}
$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年。讨个好彩头,结贴了。