从字符串中提取数字


php, strpos extract digit from string

我有一个巨大的html代码扫描。到目前为止,我一直在使用preg_match_all从中提取所需的部分。从一开始的问题就是它非常消耗cpu时间。我们最后决定用其他方法提取。我在一些文章中读到preg_match可以与strpos在性能上进行比较。他们声称strpos在效率上胜过regex扫描器高达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返回匹配发生的地方的开始索引。但是我如何使用它来:

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

谢谢你的帮助和提示;)

使用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
        )
)

这个正则表达式使用0次回溯在24步中找到匹配

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

您发布的正则表达式需要134步。也许你会注意到不同?注意,正则表达式引擎可以进行优化,使回溯最小化。我使用RegexBuddy的调试器来调试这些数字