簡體   English   中英

PHP正則表達式-找到最高價值

[英]PHP regex - Find the highest value

我需要在這樣的字符串上找到最高的數字:

<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,因為它是“結束”值上的最高數字。

我想我應該使用正則表達式,但是我不知道如何:(

任何幫助將不勝感激!

您不應該使用正則表達式來執行此操作。 實際上,我什至不知道你會怎么做。 應該使用HTML解析器,使用parse_str()從每個<a>標記的href屬性中解析出end參數,然后找到它們的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'];

查找整個字符串中的最高數字 ,無論位置如何,都可以使用

范例( demo

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

這是通過將字符串除以不是數字的任何東西來工作的,從而為您提供一個包含字符串所有數字的數組,然后從該數組中獲取最大的數字。

首先從鏈接中提取所有數字,然后應用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;
}
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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM