代码之家  ›  专栏  ›  技术社区  ›  Rudiger W.

php preg_match_all谜语

  •  0
  • Rudiger W.  · 技术社区  · 7 年前

    我使用的是5.6版的PHP,我不明白为什么正则表达式与第二行不匹配。

     $str = '<tr><td class="DH">Sale Date</td></tr><tr><td class="DD">10-MAR-15</td></tr><tr><td class="DD">18-APR-17</td></tr>';
    
     preg_match_all('/<tr>.*?class="D.*?<\/tr>/', $str, $matches);
     print_r($matches);
    
     preg_match_all('/<tr>.*?class="DH.*?<\/tr>/', $str, $matches);
     print_r($matches);
    
     preg_match_all('/<tr>.*?class="DD.*?<\/tr>/', $str, $matches);
     print_r($matches);
    

    此代码输出:

    Array
    (
        [0] => Array
            (
                [0] => <tr><td class="DH">Sale Date</td></tr>
                [1] => <tr><td class="DD">10-MAR-15</td></tr>
                [2] => <tr><td class="DD">18-APR-17</td></tr>
            )
    
    )
    Array
    (
        [0] => Array
            (
                [0] => <tr><td class="DH">Sale Date</td></tr>
            )
    
    )
    Array
    (
        [0] => Array
            (
                [0] => <tr><td class="DH">Sale Date</td></tr><tr><td class="DD">10-MAR-15</td></tr>
                [1] => <tr><td class="DD">18-APR-17</td></tr>
            )
    
    )
    

    regex本质上意味着匹配 <tr> </tr> 包含 class="D .

    注意第一个regex如何正确匹配所有3行。

    第二个相同,但希望行包含 class="DH 这是正确的。

    第三个regex应该与包含 class="DD . 出于某种原因,只有第一个结果(对应于第二个表行)想要包含前一行。

    即使我在 </TR & GT; <TR & GT; 如在 </tr> <tr> 我得到了同样的结果。但是,如果我插入一个换行符,就可以了。

    有人能解释发生了什么以及如何修复我的代码吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   dave    7 年前
    /<tr>.*?class="DD.*?/
    

    说“找到” <tr> 然后匹配 一切 直到你找到 class="DD" . 所以它看到:

    <tr><td class="DH">Sale Date</td></tr><tr><td class="DD">
    

    和第一个匹配 <TR & GT; 然后 .* 比赛 <td class="DH">Sale Date</td></tr><tr><td 然后看到 class="DH" 与下一部分匹配。

    添加换行符时, * 停止匹配,所以它可以工作。