php,strpos从字符串中提取数字

Mev*_*via 5 php regex strpos

我有一个巨大的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>
Run Code Online (Sandbox Code Playgroud)

我想只从每个id中提取数字,只从a标签内容中提取文本(字母).所以我做这个preg_match_all扫描:

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

在这里你可以看到结果:LINK

现在,如果我想将我的方法替换为strpos功能,该方法将如何?据我所知,strpos返回匹配发生的起始索引.但我怎么能用它来:

  • 获得所有可能的匹配,而不仅仅是一个
  • 从字符串中的所需位置提取数字或文本

感谢您的所有帮助和提示;)

Nar*_*dia 3

使用 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);
Run Code Online (Sandbox Code Playgroud)

输出 :

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

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

)
Run Code Online (Sandbox Code Playgroud)