求一个PHP正则表达解法
时间:2011-11-23
来源:互联网
asd<b=1>asd<a=1>asdasd<a=2>dsa<a=3>ddd</b>vv<b=2>asd<a=1>asdasd<a=2>dsa<a=3>ddd</b>czxxc
求 <b=1>...</b> 内 所有 a的值组成得数组
现在我是两步实现:
PHP code
<?php $s = 'asd<b=1>asd<a=1>asdasd<a=2>dsa<a=3>ddd</b>vv<b=2>asd<a=1>asdasd<a=2>dsa<a=3>ddd</b>czxxc'; preg_match('/<b=1>.*?<\/b>/', $s, $m); preg_match_all('/<a=(\d)>/', $m[0],$v); var_dump($v[1]); // a 所有的值 ?>
输出:
array(3) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
}
求仅用一次匹配出来.
作者: beshy 发布时间: 2011-11-23
preg_match_all('/<b=1>[^<]*<a=(\d+)>[^>]*<a=(\d+)>[^<]*<a=(\d+)>[^>]*<\/b>/iU', $s, $m); print_r($m);
Array
(
[0] => Array
(
[0] => <b=1>asd<a=1>asdasd<a=2>dsa<a=3>ddd</b>
)
[1] => Array
(
[0] => 1
)
[2] => Array
(
[0] => 2
)
[3] => Array
(
[0] => 3
)
)
作者: jordan102 发布时间: 2011-11-23
PHP code
preg_match_all('/<b=1>[^<]*<a=(\d+)>[^>]*<a=(\d+)>[^<]*<a=(\d+)>[^>]*<\/b>/iU', $s, $m);
print_r($m);
Array
(
[0] => Array
(
[0] => <b=1>asd<a=1>asdasd<a=2……
额.. 这个...
楼下大侠继续...
作者: beshy 发布时间: 2011-11-23
PHP code
$str = 'asd<b=1>asd<a=1>asdasd<a=2>dsa<a=3>ddd</b>vv<b=2>asd<a=4>asdasd<a=5>dsa<a=6>ddd</b>czxxc'; $pat = '#(?:<b=1>|\G>)[^<>]+<a=\K\d#'; preg_match_all($pat,$str,$m); print_r($m); /** Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 3 ) ) */
作者: foolbirdflyfirst 发布时间: 2011-11-23
试试
PHP code
$str = 'asd<b=1>asd<a=1>asdasd<a=2>dsa<a=3>ddd</b>vv<b=2>asd<a=4>asdasd<a=5>dsa<a=6>ddd</b>czxxc';
$pat……
你好,foolbirdflyfirst
关于正则后向引用\K这种方式,能否解释一下怎么使用呢?
只用过\1,\2...这种后向引用方式,谢谢你。
作者: ohmygirl 发布时间: 2011-11-23
引用 3 楼 foolbirdflyfirst 的回复:
试试
PHP code
$str = 'asd<b=1>asd<a=1>asdasd<a=2>dsa<a=3>ddd</b>vv<b=2>asd<a=4>asdasd<a=5>dsa<a=6>ddd</b>czxxc';
$pat……
你好,foolbirdflyfirst
关于正则后向引用\K这种方式,能否解释一……
:)
怎么说呢,这个不算是后向引用,以我的话说就是:轮转式匹配。
\K : 表示匹配后后面的正则(上面是\d),并找下一个匹配开始
\G : 表示下一轮匹配开始,以后面那个正则开始(上面是>)
假若把上面的\G去掉,会匹配所有的<a>,而不是跟着<b=1>的.因为\K后找不到下一轮正确的匹配起始位置
作者: foolbirdflyfirst 发布时间: 2011-11-23
我觉得这里的正则,要实现在 X和Y之间去寻到具有循环的匹配。
我尝试用另一种方法去:
PHP code
//正则: /<b=1>(?:\w*<a=(\d)>\w*)*<\/b>/ //但不成功,只能获取最后一个 3. 为什么呢?想不明白。。
作者: yangball 发布时间: 2011-11-23
对于 K,G这两个好像没什么资料谈及过
我觉得这里的正则,要实现在 X和Y之间去寻到具有循环的匹配。
我尝试用另一种方法去:
PHP code
//正则:
/<b=1>(?:\w*<a=(\d)>\w*)*<\/b>/
//但不成功,只能获取最后一个 3.
为什么呢?想不明白。。
我刚开始的尝试跟你一样。但是这样会被覆盖的,也就是说,取到的是最后的一个值。
作者: ohmygirl 发布时间: 2011-11-23
引用 4 楼 ohmygirl 的回复:
引用 3 楼 foolbirdflyfirst 的回复:
试试
PHP code
$str = 'asd<b=1>asd<a=1>asdasd<a=2>dsa<a=3>ddd</b>vv<b=2>asd<a=4>asdasd<a=5>dsa<a=6>ddd</b>czxxc';
$pat……
你好,foolbirdflyfir……
哈,谢谢,柳暗花明又一村,了解点了。
作者: ohmygirl 发布时间: 2011-11-23
作者: qq160226466 发布时间: 2011-11-23
按我的想法,匹配到一个然后入栈,依次循环才对的。
作者: yangball 发布时间: 2011-11-23
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28