Php preg_match在使用cURL获取数据时会丢失一些ID

Php preg_match在使用cURL获取数据时会丢失一些ID,php,curl,Php,Curl,出于学习目的,我尝试从Steam存储中获取数据,如果图像game\u header\u image\u full存在,则我已到达一个游戏。两种选择都是可行的,但有一个陷阱。一个非常慢,另一个似乎丢失了一些数据,因此没有将URL写入文本文件 出于某种原因,简单的HTMLDOM捕获了9个URL,而第二个(cURL)只捕获了8个带有preg_匹配的URL 问题1 $reg的格式是否符合$html->find('img.game\u header\u image\u full')的要求,而不是我的pre

出于学习目的,我尝试从Steam存储中获取数据,如果图像
game\u header\u image\u full
存在,则我已到达一个游戏。两种选择都是可行的,但有一个陷阱。一个非常慢,另一个似乎丢失了一些数据,因此没有将URL写入文本文件

出于某种原因,简单的HTMLDOM捕获了9个URL,而第二个(cURL)只捕获了8个带有preg_匹配的URL

问题1

$reg
的格式是否符合
$html->find('img.game\u header\u image\u full')
的要求,而不是我的
preg\u match
?还是问题出在其他方面

问题2

我在这里做得对吗?我打算换成卷发,但我能不能加快速度

简单的HTMLDOM解析器(搜索100个ID的时间:1分钟,39秒。返回:9URL。)


您不应该在HTML中使用正则表达式。它基本上是有效的,但当它不起作用时,你必须翻阅数百页,找出哪一页是失败的,以及为什么,并纠正正则表达式,然后希望并祈祷在未来不会再有类似的事情发生。剧透警报:会的

长话短说,读下面这个有趣的答案:


不要使用正则表达式来解析HTML。使用HTML解析器,它们是不使用正则表达式的复杂算法,并且是可靠的(只要HTML是有效的)。在第一个示例中,您已经在使用一个。是的,它很慢,因为它不仅仅是在文档中搜索字符串。但它是可靠的。您还可以使用其他实现,尤其是本机实现,例如

我就把它留在这里。@AlexanderMP我是一个磨砂工,这类工作很有效。我很抱歉,不,我明白。我用过的正则表达式比我想承认的要多。然而,当它有时因为一些愚蠢的原因而失败时,不要感到惊讶。然后,您必须手动浏览100个HTML页面,找出哪些页面应该匹配,哪些页面不匹配。我的意思是肯定的,正则表达式速度很快,可以节省多达60%的时间,但它并不完全有效,这就是为什么要使用HTML解析器,它们速度慢且可靠。另外,对于将来正则表达式与php的结合使用,还有一个好的提示:千万不要对正则表达式使用双引号。你为什么要那样做?使用单引号并跳过所有那些双反斜杠和四反斜杠。不需要在字符串中转义。就像在JS或其他语言中转义正则表达式一样。。问题在于正则表达式,对此我无能为力:/
<?php
    include('simple_html_dom.php');

    $i = 0;
    $times_to_run = 100;
    set_time_limit(0);

    while ($i++ < $times_to_run) {
        // Find target image
        $url = "http://store.steampowered.com/app/".$i;
        $html = file_get_html($url);
        $element = $html->find('img.game_header_image_full');

        if($i == $times_to_run) {
            echo "Success!";
        }

        foreach($element as $key => $value){
        // Check if image was found
            if (strpos($value,'img') == false) {
                // Do nothing, repeat loop with $i++;

            } else {
                // Add (don't overwrite) to file steam.txt
                file_put_contents('steam.txt', $url.PHP_EOL , FILE_APPEND);
            }
        }
    }
?>
<?php

    $i = 0;
    $times_to_run = 100;
    set_time_limit(0);

    while ($i++ < $times_to_run) {

        $ch = curl_init();
        curl_setopt( $ch, CURLOPT_URL, 'http://store.steampowered.com/app/'.$i);
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true);
        $content = curl_exec($ch);

        $url = "http://store.steampowered.com/app/".$i;

        $reg = "/<\\s*img\\s+[^>]*class=['\"][^'\"]*game_header_image_full[^'\"]*['\"]/i";

        if(preg_match($reg, $content)) {
            file_put_contents('steam.txt', $url.PHP_EOL , FILE_APPEND);
        }

    }

?>