如何使用preg_match_all

时间:2017-07-29 23:26:07

标签: php regex preg-match-all

如何在此示例中使用preg_match_all()

<div class="b1 b2 A1 C7" style="right: 9px; top:5px;">
    <div class="tr">1</div>
</div>

<div class="b1 b2  A4 C2" style="right: 19px; top:5px;">
    <div class="tr">2</div>
</div>

<div class="b1 b2  A1 C4" style="right: 29px; top:5px;">
    <div class="tr">2</div>
</div>

我想获得这些值

  1. 1 A
  2. 之后的数字
  3. C 7 C
  4. 之后的数字
  5. <div class="tr"> 1 </div> DIV
  6. 之间的数字

    这就是我试过的

    preg_match_all('/A(.+?) C(.+?)| class="tr">(\d+)<\/div><\/div>/s', $str, $m);
    

    但现在工作我不想使用preg_replace()新行或空格。

2 个答案:

答案 0 :(得分:1)

这项工作针对您的具体情况:

preg_match_all('/A(\d+?)|C(\d+?)|\<div class="tr"\>(\d+?)\<\/div\>/s', $str, $m);

返回:

[0] => Array
    (
        [0] => A1
        [1] => C7
        [2] => <div class="tr">1</div>
        [3] => A4
        [4] => C2
        [5] => <div class="tr">2</div>
        [6] => A1
        [7] => C4
        [8] => <div class="tr">2</div>
    )

[1] => Array
    (
        [0] => 1
        [1] => 
        [2] => 
        [3] => 4
        [4] => 
        [5] => 
        [6] => 1
        [7] => 
        [8] => 
    )

[2] => Array
    (
        [0] => 
        [1] => 7
        [2] => 
        [3] => 
        [4] => 2
        [5] => 
        [6] => 
        [7] => 4
        [8] => 
    )

[3] => Array
    (
        [0] => 
        [1] => 
        [2] => 1
        [3] => 
        [4] => 
        [5] => 2
        [6] => 
        [7] => 
        [8] => 2
    )

答案 1 :(得分:1)

您想要的模式是:

/A(\d+) C(\d+)[^<]+<div class="tr">(\d+)/

Demo

这种模式要快得多,因为它不使用任何管道(|),它使用一个否定的字符类来快速移向最终的捕获组。

同样重要的是要注意我的模式不会进行任何不必要的字符转义。 {“1}}字符在”贪婪“模式下同样安全,因此\d可以删除。

由于模式中没有? s,.标志在正则表达式模式的末尾没有用处 - 所以我删除了它。

与MTK的741步相比,我的模式只需90步即可完成。