匹配直到第二次出现

时间:2014-08-01 03:40:09

标签: php regex

我是这个字符串:

<h3>Test</h3><table></table><table></table><table></table>

我的预期结果:

<h3>Test</h3><table></table><table></table>

我试过了:

<h3>Test<\/h3>.+?(\/table>)

但它是懒惰的表达,所以结果将是:

<h3>Test</h3><table></table>

如果我没错,我需要使用HTML Dom Parser来完成这项任务,但只是好奇如何在这种情况下使用正则表达式来完成它。

2 个答案:

答案 0 :(得分:1)

由于您很好奇如何使用正则表达式执行此操作,您可以使用贪心量词而不是正向前瞻。

preg_match('~<h3>Test</h3>.+(?=<table>)~', $text, $match);
echo $match[0]; //=> "<h3>Test</h3><table></table><table></table>"

但我不清楚这些是否是真正的空表,如果你们之间有内容:

preg_match('~<h3>Test</h3>(?:.*?</table>){2}~', $text, $match);

使用正确的工具:

$doc = DOMDocument::loadHTML('
     <h3>Test</h3><table></table><table></table><table></table>
');
$xpath = new DOMXPath($doc);
$node  = $xpath->query('//table[last()]')->item(0);
$nnode = $node->parentNode->removeChild($node);
echo $doc->saveHtml();

Working Demo

答案 1 :(得分:0)

使用延迟表达式的一个例子是:

"<h3>Test</h3>.+?</table>.+?</table>"