4

ヤフー更新エラー

わかりましたので、すべて機能しましたが、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 しようとしています。

私はサイトを取得することに成功しましたが、リンクの結果を取得しようとすると、時間がかかりすぎます。

私は現在使用しています: 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);

}
4

2 に答える 2

4

U -ngready モードで正規表現を実行する

preg_match_all('#<cite>(.+)</cite>#siU
于 2012-10-17T07:13:48.820 に答える
2

Darhazerの回答のように、パターン修飾子を使用して正規表現全体に対して貪欲でないモードをオンUにするか、:を付けてパターン自体を貪欲でない(または怠惰な)ものにすることができ?ます。

preg_match_all('#<cite>(.+?)</cite>#si', ...
于 2012-10-17T07:19:51.360 に答える