正则表达式 PHP

有个关于反向引用的问题,以下用PHP描述:

$str="5aaaaa";
//一个名为str的字符串,里面由5和5个a组成

很明显有很多表达式匹配它,比如:
preg_match("/\d\w{5}/",$str,$phones);

然后我想获取前面的整数,比如:
preg_match("/(\d)\w{5}/",$str,$phones);
这样$phones[1]就是里面的整数

接下来,我想反向引用,在PHP中使用\1来内部嵌入捕获内容,比如:
preg_match("/(\d)(\w)\2/",$str,$phones);
这样也可以匹配$str,因为\w匹配了a,而\2代表a

问题是,我想在{}中嵌入刚刚捕获的数字,比如:
preg_match("/(\d)\w{\1}/",$str,$phones);
但这个表达式无法匹配到指定的值,我的本意是想匹配:
preg_match("/(\d)\w{5}/",$str,$phones);

请问我应该如何改preg_match("/(\d)\w{\1}/",$str,$phones);,以使它能够匹配"6cccccc""7ddddddd"等等,谢谢。
To 回答者:无缘☆与酒 - 经理 四级 1-11 17:25:

本来我也是这样想的,但发现有很多数据根本没法准确捕获,因为没法在一条式子里确定要获取的字数。所以用函数的方法是不行的,只能在一个式子里完成。

To 回答者:fennng - 参将 八级 1-12 15:26
回答者:liuxinling_06 - 魔法师 五级 1-12 16:15

具体应用的例子没那么简单的,比如(5aaaaa)(6bbbbbb)(7cccccc)或者更复杂的(5ab3de)(6cde9gh),\d后面的内容也可能包含数字,非常的乱,只能用第一位数字来判定到底有几位。所以必须在正则表达式内完成,否则根本没法匹配。

如果{}内确实不能使用反向引用的话,那可能用正则表达式就没有解决办法了。

To 回答者:liuxinling_06 - 魔法师 五级 1-14 17:24:
你理解错了,那个括号只是帮助大家明白我的意思而已……实际中并没有这个括号,比如我写(5ab3de)(6cde9gh),实际上只是5ab3de6cde9gh,明白?我是怕大家看不明白所以加的括号。

To 回答者:ynsjwh - 江湖少侠 六级 1-14 21:40:
问题补充里写得很清楚,要做什么,范例也有。如果正则表达式不行,只好结题了。

第1个回答  2008-01-14
{}中不能使用反向引用,至少不能直接使用,有没有其他使用方法不祥(可能性比较小)

建议解决方式:

使用如下正则以及判断
$str="5aaaaa";
$ret=preg_match("/^(\d)(\w)\\2*$/",$str,$phones);
if($ret==1)
{
if($phones[1]==strlen($phones[0])-1)
{
echo('true');
}
else
{
echo('false1');
}
}
else
{
echo('false2');
}
说明:
先用正则表达式/^(\d)(\w)\\2*$/确定字符串必须为数字开头,第二个为字符,从第二个字符开始重复直到结束
然后进行条件判断,因为$phones[1]中存放了第一个字符,因此比较字符串长度就可以了

===========================================
补充:
如果你的这个字符串需要从某个大的正则表达式中的匹配,那么我建议你用括号把这个字符串匹配到的结果括起来做一个子模式.

例如:
$str="(5ab3de)(6cde9gh)";
$ret=preg_match("/\(((\d)\w*)\)\(((\d)\w*)\)/",$str,$phones);
print_r($phones);

这样$phones[1]表示字符串,$phones[2]表示字符串长度,然后再做判断.对于杂乱无章的字符串反而简单用\w*就可以了.
第2个回答  2008-01-14
同意liuxinling_06的思路,不过对他提供的正则做一点小小的改动,就更符合楼主的要求了。

'/^(\d)([a-z])\2*$/i'

这样就只能匹配“以一个数字起始,后跟一串字母,这些字母是完全相同的”这样的字符串。

然后再用liuxinling_06提供的if语句进行检测。

那你倒是说清楚"杂乱无章"到底允许哪些字符啊. 如果只是允许数字和字母, 正则稍微改一下就可以了. 其实大家都把思路跟你讲得很清楚了, 你完全根据可以自己的需要发挥, 除非你一点都不了解正则表达式.
/^(\d)([a-z])*$/i
另外再告诉你, 你想仅靠正则表达式完成你所说的功能是行不通的.本回答被网友采纳
第3个回答  2008-01-12
一定要在一句里面完成吗?

如果不一定的话,你可以先提取第一个数字,把它存在一个变量里.

然后再匹配一次,把变量放进{}就可以了.
第4个回答  2008-01-11
写一个正则表达式的函数

然后就调用他 把你的变量引入函数

以后只要改函数 后台的代码一点都不用改

我认为蛮好用 你试试!!

嘿嘿~~~
第5个回答  2008-01-14
门外汉,探个头瞅一眼就走人!

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网