php - Preg_match_all 没有停在它应该在的地方

标签 php search curl preg-match-all

更新雅虎错误

好的,所以我让一切正常,但是 preg_match_all 不会对 Yahoo 起作用。 如果你看一下: http://se.search.yahoo.com/search?p=random&toggle=1&cop=mss&ei=UTF-8&fr=yfp-t 然后你可以在他们的html中看到,他们有 <span class="url" id="something random"> the actual link </span> 但是当我尝试 preg_match_all 时,我不会得到任何结果。

preg_match_all('#<span class="url" id="(.*)">(.+?)</span>#si', $urlContents[2], $yahoo);

有人知道吗?

更新结束

我正在尝试使用 cURL curl_multi_getcontent 方法 preg_match_all 我从 Google 获得的结果。

我已成功获取网站等,但是当我尝试获取链接的结果时,它花费的时间太多了。

我目前正在使用: preg_match_all('#<cite>(.+)</cite>#si', $urlContents[0], $links);

它从它应该在的地方开始,但它不会停止,它只会继续前进。 在 www.google.com/search?q=random 查看 HTML例如,您会看到所有链接都以 . 开头和结尾。

有人可以帮助我如何检索这些信息吗? 我只需要每个结果的实际链接地址。

更新整个 PHP 脚本

public function multiSearch($question)
{
    $sites['google'] = "http://www.google.com/search?q={$question}&gl=sv";
    $sites['bing'] = "http://www.bing.com/search?q={$question}";
    $sites['yahoo'] = "http://se.search.yahoo.com/search?p={$question}";

    $urlHandler = array();

    foreach($sites as $site)
    {
        $handler = curl_init();
        curl_setopt($handler, CURLOPT_URL, $site);
        curl_setopt($handler, CURLOPT_HEADER, 0);
        curl_setopt($handler, CURLOPT_RETURNTRANSFER, 1);

        array_push($urlHandler, $handler);
    }

    $multiHandler = curl_multi_init();
    foreach($urlHandler as $key => $url)
    {
        curl_multi_add_handle($multiHandler, $url);
    }

    $running = null;
    do
    {
        curl_multi_exec($multiHandler, $running);
    }
    while($running > 0);

    $urlContents = array();
    foreach($urlHandler as $key => $url)
    {
        $urlContents[$key] = curl_multi_getcontent($url);
    }

    foreach($urlHandler as $key => $url)
    {
        curl_multi_remove_handle($multiHandler, $url);
    }

    foreach($urlContents as $urlContent)
    {
        preg_match_all('/<li class="g">(.*?)<\/li>/si', $urlContent, $matches);
        //$this->view_data['results'][] = "Random";
    }
    preg_match_all('#<div id="search"(.*)</ol></div>#i', $urlContents[0], $match);
    preg_match_all('#<cite>(.+)</cite>#si', $urlContents[0], $links);
    var_dump($links);

}

最佳答案

U-ngready 模式下运行正则表达式

preg_match_all('#<cite>(.+)</cite>#siU

关于php - Preg_match_all 没有停在它应该在的地方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12928959/

相关文章:

php - 如何通过 PHP 分隔 SQL 联合上的值

php - 在php中将mysql数据显示到文本字段中的问题

php - jQuery 循环在值 < 4 后继续,在 For 循环中从 1 重新开始

c# - 如果我使用 LINQ,如何限制搜索字符

algorithm - 在随机数据中搜索字符串

php - 使用 Curl 和 PHP 将多部分 PUT 上传到 REST 端点

macos - 如何修复 curl : (60) SSL certificate: Invalid certificate chain

没有登录的 PHP 购物车 - cookie vs session vs 两者?

django-haystack 排序 - 我该如何处理这个问题?

Azure-AKS:使用 Postman 测试启用了 TLS 的 Ingress