+ -
当前位置:首页 → 问答吧 → 求一个PHP正则表达解法

求一个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

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>dsa<a=3>ddd</b>
  )

  [1] => Array
  (
  [0] => 1
  )

  [2] => Array
  (
  [0] => 2
  )

  [3] => Array
  (
  [0] => 3
  )

)

作者: jordan102   发布时间: 2011-11-23

引用 1 楼 jordan102 的回复:

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

引用 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这种方式,能否解释一下怎么使用呢?
只用过\1,\2...这种后向引用方式,谢谢你。

作者: 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……


你好,foolbirdflyfirst
关于正则后向引用\K这种方式,能否解释一……

:)
怎么说呢,这个不算是后向引用,以我的话说就是:轮转式匹配。
\K : 表示匹配后后面的正则(上面是\d),并找下一个匹配开始
\G : 表示下一轮匹配开始,以后面那个正则开始(上面是>)
假若把上面的\G去掉,会匹配所有的<a>,而不是跟着<b=1>的.因为\K后找不到下一轮正确的匹配起始位置

作者: foolbirdflyfirst   发布时间: 2011-11-23

对于 K,G这两个好像没什么资料谈及过

我觉得这里的正则,要实现在 X和Y之间去寻到具有循环的匹配。
我尝试用另一种方法去:

PHP code

//正则:
/<b=1>(?:\w*<a=(\d)>\w*)*<\/b>/
//但不成功,只能获取最后一个 3.
为什么呢?想不明白。。

作者: yangball   发布时间: 2011-11-23

引用 6 楼 yangball 的回复:

对于 K,G这两个好像没什么资料谈及过

我觉得这里的正则,要实现在 X和Y之间去寻到具有循环的匹配。
我尝试用另一种方法去:

PHP code

//正则:
/<b=1>(?:\w*<a=(\d)>\w*)*<\/b>/
//但不成功,只能获取最后一个 3.
为什么呢?想不明白。。


我刚开始的尝试跟你一样。但是这样会被覆盖的,也就是说,取到的是最后的一个值。

作者: ohmygirl   发布时间: 2011-11-23

引用 5 楼 foolbirdflyfirst 的回复:

引用 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

我的网站也遇到这样的问题,但一直弄不明白,麻烦各位进我的网站http://www.itccoo.com/帮我进去看看小女子万分感激!!

作者: qq160226466   发布时间: 2011-11-23

但很明显 (a=) 这个有很多层,我都 + 来表示其有重复的情况了

按我的想法,匹配到一个然后入栈,依次循环才对的。

作者: yangball   发布时间: 2011-11-23

相关阅读 更多