我使用的是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>
之间添加空格,也得到相同的结果。但是,如果我插入换行符,则工作正常。
谁能解释这是怎么回事以及如何修复我的代码?
答案 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"
匹配下一部分。
添加换行符时,.*
停止匹配,因此可以正常工作。