Preg Match子模式-如何匹配字符串后的所有TD

时间:2018-11-28 16:01:09

标签: php preg-match

$str = '<tr>
<td>First thing</td>
<td>some stuff <b>150</b></td>
<td>350</td>
<td>250</td>
</tr>
<tr>
<td>Second thing</td>
<td>150</td>
<td>350</td>
<td>250</td>
</tr>';

理想的输出:

找到单词“ First”的开头,然后将每个字符串放入TD之后,以TR结尾,而不是第二行。

方法:

我知道我可以使用几个嵌套的preg_match_callback()

或者我可以使用HTML DOM内容

但是出于代码的原因,我想看看使用子模式在正则表达式中是否可行。

// This is what I have so far...

preg_match_all('~
<td>
(
    (?:
        (?!</td).  # absolutely no idea what this does
    )*
)
</td>
~isx', $str, $m);


print_r($m);

1 个答案:

答案 0 :(得分:0)

好吧,所以我这样解决了:

$pos = stripos($str, "First");
$html_TR = substr($str, $pos, stripos($str, '</tr>', $pos));

$pattern = '~ <td> (?: (?!(<td>|</td>)). | (?R) )*+ </td> ~x';

preg_match_all($pattern, $html_TR, $matches);
$html_TDs = $matches[0];

print_r($html_TDs);

不是终极解决方案,但它会做到:(

我想我必须使用2个递归子模式来匹配TR,但我做不到。