【问题标题】:Preg_match_all not stopping where it should bePreg_match_all 没有停止它应该在的地方
【发布时间】:2012-10-17 07:10:04
【问题描述】:

更新 Yahoo 错误

好的,所以我一切正常,但 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 方法预匹配我从 Google 获得的所有结果。

我已经成功获取了站点等,但是当我尝试获取链接的结果时,它需要的时间太多了。

我目前正在使用: preg_match_all('#&lt;cite&gt;(.+)&lt;/cite&gt;#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);

}

【问题讨论】:

  • 你能把你的PHP脚本给我们检查一下吗?
  • 当然。但正如我所提到的,它确实检索了实际的 HTML 文档,因此脚本没有任何问题。我使用 preg_match_all 只获取结果部分,但它仅适用于链接。不管怎样,我会用整个脚本更新主帖。

标签: php search curl preg-match-all


【解决方案1】:

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

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

【讨论】:

  • 你知道如何解决我更新的问题@Darhazer 或@Jack?
  • @DanielRunnakkoLöfgren 同样的问题,但这次是(.*);你应该有(.*?)
  • @Jack 这次不行了。当我使用我在 Notepad++ 中发布的正则表达式时,它可以按预期工作,但由于某种原因在 PHP 中不能。
【解决方案2】:

在 Darhazer 的回答中,您可以使用 U 模式修饰符为整个正则表达式打开 ungreedy 模式,或者只是使模式本身不贪婪(或 lazy)通过? 关注它:

preg_match_all('#<cite>(.+?)</cite>#si', ...

【讨论】:

  • 感谢您的信息。该解决方案也能按预期工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-27
  • 1970-01-01
  • 2019-11-30
  • 2022-01-20
  • 2013-02-02
  • 1970-01-01
相关资源
最近更新 更多