我需要在字符串中找到最高的数字:
实施例
<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,因为它是“结束”值的最高数字。
我想我应该使用正则表达式,但我不知道如何:(
非常感谢任何帮助!
答案 0 :(得分:5)
你不应该用正则表达式来做这件事。事实上,我甚至不知道你会怎么做。您应该使用HTML解析器,使用parse_str()
解析每个end
标记的<a>
属性中的href
参数,然后找到{其中{3}},如下:
$doc = new DOMDocument;
$doc->loadHTML( $str); // All & should be encoded as &
$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
,如max()
中所示。
请注意,这假设您的HTML实体已正确转义,否则DOMDocument
会发出警告。
您可以执行的一项优化是保留end
值数组,而不是将最大值与当前值进行比较。但是,只有<a>
标记的数量变大时才会有用。
修改:DaveRandom指出,如果我们可以假设保留最高<a>
值的end
标记是最后一个<a>
标记在此列表中,仅仅由于分页链接的呈现方式,我们无需迭代或保留其他end
值的列表,如this demo所示。
$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'];
答案 1 :(得分:2)
要找到整个字符串中的最高数字,无论位置如何,都可以使用
示例(demo)
echo max(preg_split('/\D+/', $html, -1, PREG_SPLIT_NO_EMPTY)); // prints 89
这可以通过将而不是数字的任何内容分割为字符串,从而为您提供一个包含字符串中所有数字的数组,然后从中获取最高数字那个阵列。
答案 2 :(得分: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;
}
答案 3 :(得分: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);
}