PHP preg_match_all谜语

时间:2018-07-30 22:29:05

标签: php regex preg-match-all

我使用的是PHP 5.6版,我不知道为什么正则表达式不能正确匹配第二行。

 $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>的{​​{1}}和</tr>

请注意第一个正则表达式如何正确地分别匹配所有3行。

第二个功能相同,但希望该行包含正确执行的class="D

第三个正则表达式应该与包含class="DH的其他行匹配。出于某种原因,只有第一个结果(对应于第二个表行)才想包含上一行。

即使我在class="DD</tr>之间添加空格,也得到相同的结果。但是,如果我插入换行符,则工作正常。

谁能解释这是怎么回事以及如何修复我的代码?

1 个答案:

答案 0 :(得分:0)

/<tr>.*?class="DD.*?/

说“找到<tr>,然后匹配所有内容,直到找到class="DD"。它看到:

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

并匹配第一个<tr>,然后.*匹配<td class="DH">Sale Date</td></tr><tr><td,然后看到class="DH"匹配下一部分。

添加换行符时,.*停止匹配,因此可以正常工作。