簡體   English   中英

php,strpos從字符串中提取數字

[英]php, strpos extract digit from string

我有一個巨大的HTML代碼來掃描。 到目前為止,我一直在使用preg_match_all從中提取所需的部分。 從一開始的問題是它耗費了極大的CPU時間。 我們最終決定使用其他一些方法進行提取。 我在一些文章中讀到preg_match可以在性能上與strpos進行比較。 他們聲稱strpos擊敗正則表達式掃描儀的效率高達20倍。 我以為我會嘗試這種方法,但我真的不知道如何開始。

讓我說我有這個HTML字符串:

<li id="ncc-nba-16451" class="che10"><a href="/en/star">23 - Star</a></li>
<li id="ncd-bbt-5674" class="che10"><a href="/en/moon">54 - Moon</a></li>
<li id="ertw-cxda-c6543" class="che10"><a href="/en/sun">34,780 - Sun</a></li>

我想從內容提取每個ID只有文字(字母)僅數a標簽。 所以我這樣做preg_match_all掃描:

'/<li.*?id=".*?([\\d]+)".*?<a.*?>.*?([\\w]+)<\\/a>/s'

在這里你可以看到結果: LINK

現在,如果我想替換我的方法來strpos功能,該方法將如何? 我知道strpos返回匹配發生的起始索引。 但我怎么能用它來:

  • 獲得所有可能的匹配,而不僅僅是一個
  • 從字符串中的所需位置提取數字或文本

感謝您的所有幫助和提示;)

此正則表達式使用0回溯在24個步驟中找到匹配項

(?:id="[^\d]*(\d*))[^<]*(?:<a href="[^>]*>[^a-z]*([a-z]*))

您發布的正則表達式需要134個步驟。 也許你會注意到一個區別? 請注意,正則表達式引擎可以進行優化,以最大限度地減少回溯。 我使用了RegexBuddy的調試器來獲取數字。

使用DOM

$html = '
<html>
<head></head>
<body>
<li id="ncc-nba-16451" class="che10"><a href="/en/star">23 - Star</a></li>
<li id="ncd-bbt-5674" class="che10"><a href="/en/moon">54 - Moon</a></li>
<li id="ertw-cxda-c6543" class="che10"><a href="/en/sun">34,780 - Sun</a></li>
</body>
</html>';


$dom_document = new DOMDocument();

$dom_document->loadHTML($html);

$rootElement = $dom_document->documentElement;

$getId = $rootElement->getElementsByTagName('li');
$res = [];
foreach($getId as $tag)
{
   $data = explode('-',$tag->getAttribute('id'));
   $res['li_id'][] = end($data);
}
$getNode = $rootElement->getElementsByTagName('a');
foreach($getNode as $tag)
{
   $res['a_node'][] = $tag->parentNode->textContent;
}
print_r($res);

輸出:

Array
(
    [li_id] => Array
        (
            [0] => 16451
            [1] => 5674
            [2] => c6543
        )

    [a_node] => Array
        (
            [0] => 23 - Star
            [1] => 54 - Moon
            [2] => 34,780 - Sun
        )

)

暫無
暫無

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

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