0

所以我有以下HTML:

<td class="testing">
    <strong><span><a href="whatever">test</a></span></strong>
    <div class="body" id="id_1234">test</div>
</td>
<td class="testing">
    <strong><span><a href="whatever2">test</a></span></strong>
    <div class="body" id="id_5678">test</div>
</td>
<td class="testing2">
    <strong><span><a href="whatever2">test2</a></span></strong>
    <div class="body" id="id_9012">test</div>
</td>

我有以下正则表达式试图同时获取 1234 和 5678:

~class="testing">\s*?<strong>.*?<a href=".*?">test</a>.*?<div class="body" id="id_(.*)">~Us

但是,这仅返回 5678,而不是两者:

[1] => Array
    (
        [0] => 5678
    )

我怎样才能让它使用最短的整体匹配?我已经使用了?每个 .* 之后的修饰符,以及末尾的 U 修饰符。

谢谢!

4

4 回答 4

2

使用 DOM 和 XPath

$html = <<<_HTML
<td class="testing">
    <strong><span><a href="whatever">test</a></span></strong>
    <div class="body" id="id_1234">test</div>
</td>
<td class="testing">
    <strong><span><a href="whatever2">test</a></span></strong>
    <div class="body" id="id_5678">test</div>
</td>
<td class="testing2">
    <strong><span><a href="whatever2">test2</a></span></strong>
    <div class="body" id="id_9012">test</div>
</td>
_HTML;

$doc = new DOMDocument;
$doc->loadHTML($html);
$xp = new DOMXpath($doc);
$divs = $xp->query('//td[@class="testing" and //a[normalize-space(text())="test"]]/div[@class="body" and starts-with(@id, "id_")]');

$ids = array();
foreach ($divs as $div) {
    $ids[] = substr($div->getAttribute('id'), 3);
}

这里的例子 - http://codepad.viper-7.com/GbKIj2

于 2013-07-15T03:52:11.803 回答
2

您的模式不起作用的原因是对 U 修饰符的误解。

U 不会使所有量词变得不贪婪(或懒惰)。U 修饰符是一个开关,当你使用它时:

1)所有贪婪的量词变得不贪婪(或懒惰)

2)所有不贪心(或懒惰)的量词都变得贪心。

由于您在模式中使用了 U 修饰符,因此.*?是贪婪的。

于 2013-07-15T03:56:30.830 回答
0

您可以使用preg_match_all

preg_match_all("/id\=\"id_([0-9]+)\"/g", $html, $matches);
于 2013-07-15T03:39:23.660 回答
0

这会产生您所追求的结果:

<?php

$str = '<td class="testing">
    <strong><span><a href="whatever">test</a></span></strong>
    <div class="body" id="id_1234">test</div>
</td>
<td class="testing">
    <strong><span><a href="whatever2">test2</a></span></strong>
    <div class="body" id="id_5678">test</div>
</td>';

$matches = array();

preg_match_all('/id\="id_([0-9]+)\"/m', $str, $matches);

print_r($matches[1]);
于 2013-07-15T03:48:31.753 回答