0

我需要在这样的字符串上找到最大的数字:

例子

<div id='pages'>
 <a href='pages.php?start=0&end=20'>Page 1</a>
 <a href='pages.php?start=20&end=40'>Page 2</a>
 <a href='pages.php?start=40&end=60'>Page 3</a>
 <a href='pages.php?start=60&end=80'>Page 4</a>
 <a href='pages.php?start=80&end=89'>Page 5</a>
</div>

在这个例子中,我应该得到 89,因为它是“结束”值的最高数字。

我想我应该使用正则表达式,但我不知道如何:(

任何帮助将不胜感激!

4

4 回答 4

5

您不应该使用正则表达式来执行此操作。事实上,我什至不知道你会怎么做。您应该使用 HTML 解析器,end从每个<a>标签的href属性中解析出参数parse_str(),然后找到max()它们,如下所示:

$doc = new DOMDocument;
$doc->loadHTML( $str); // All & should be encoded as &amp; 
$xpath = new DOMXPath( $doc);
$end_vals = array();
foreach( $xpath->query( '//div[@id="pages"]/a') as $a) {
    parse_str( $a->getAttribute( 'href'), $params);
    $end_vals[] = $params['end'];
}
echo max( $end_vals);

89本演示所示,将打印上面的内容。

请注意,这假定您的 HTML 实体已正确转义,否则DOMDocument将发出警告。

您可以做的一种优化不是保留一个end值数组,而是将看到的最大值与当前值进行比较。<a>但是,这仅在标签数量变大时才有用。

编辑:正如 DaveRandom 指出的那样,如果我们可以假设<a>拥有最高end值的<a>标签是该列表中的最后一个标签,仅仅由于分页链接的呈现方式,那么我们不需要迭代或保留列表其他end值,如下例所示。

$doc = new DOMDocument;
$doc->loadHTML( $str); 
$xpath = new DOMXPath( $doc);
parse_str( $xpath->evaluate( 'string(//div[@id="pages"]/a[last()]/@href)'), $params);
echo $params['end'];
于 2013-05-23T17:06:56.680 回答
2

查找整个字符串中的最高数字,无论位置如何,都可以使用

示例(演示

echo max(preg_split('/\D+/', $html, -1, PREG_SPLIT_NO_EMPTY)); // prints 89

这通过将字符串拆分为任何非数字来工作,为您留下一个包含字符串中所有数字的数组,然后从该数组中获取最高数字。

于 2013-05-23T20:19:43.033 回答
1

首先从链接中提取所有数字,然后应用 max 函数:

$str = "<div id='pages'>
 <a href='pages.php?start=0&end=20'>Page 1</a>
 <a href='pages.php?start=20&end=40'>Page 2</a>
 <a href='pages.php?start=40&end=60'>Page 3</a>
 <a href='pages.php?start=60&end=80'>Page 4</a>
 <a href='pages.php?start=80&end=89'>Page 5</a>
</div>";

if(preg_match_all("/href=['][^']+end=([0-9]+)[']/i", $str, $matches))
{
    $maxVal = max($matches[1]);
    echo $maxVal;
}
于 2013-05-23T17:13:58.250 回答
0
function getHighest($html) {
    $my_document = new DOMDocument();
    $my_document->loadHTML($html);
    $nodes = $my_document->getElementsByTagName('a');
    $numbers = array();

    foreach ($nodes as $node) {
        if (preg_match('\d+$', $node->getAttribute('href'), $match) == 1) {
            $numbers[]= intval($match[0])
        }
    }

    return max($numbers);
}
于 2013-05-23T17:11:27.893 回答