0

这个问题已被多次询问,但我没有找到满足我需求的有效解决方案。

我创建了一个函数来检查 Google Ajax API 输出中的 URL: https ://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=site%3Awww.bierdopje.com %2Fusers%2F+%22Gebruikersprofiel+van+%22+Stevo

我想从输出中排除“配置文件”这个词。因此,如果字符串包含该单词,则跳过整个字符串。

这是我到目前为止创建的功能:

function getUrls($data)
{
    $regex = '/https?\:\/\/www.bierdopje.com[^\" ]+/i';
    preg_match_all($regex, $data, $matches);
    return ($matches[0]);
}

$urls = getUrls($data);
$filteredurls = array_unique($urls);

我创建了一个示例来明确我的意思:
http ://rubular.com/r/1U9YfxdQoU

在示例中,您可以看到选择了 4 个字符串,我只需要上面的 2 个字符串。我怎样才能做到这一点?

4

2 回答 2

1

不要使用正则表达式来解析 JSON 数据。您要做的是解析 JSON 并对其进行循环以找到正确的匹配元素。

示例代码:

$input = file_get_contents('https://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=site%3Awww.bierdopje.com%2Fusers%2F+%22Gebruikersprofiel+van+%22+Stevo');
$parsed = json_decode($input);

$cnt = 0;
foreach($parsed->responseData->results as $response)
{
   // Skip strings with 'profile' in there
   if(strpos($response->url, 'profile') !== false)
       continue;

   echo "Result ".++$cnt."\n\n";
   echo 'URL: '.$response->url."\n";
   echo 'Shown: '.$response->visibleUrl."\n";
   echo 'Cache: '.$response->cacheUrl."\n\n\n";
}

Sample on CodePad(因为它不支持加载外部文件,所以字符串被内联在那里)

于 2013-05-30T12:48:24.323 回答
1
function getUrls($data)
{
    $regex = '@"(https?://www\\.bierdopje\\.com[^"]*+(?<!/profile))"@';
    return preg_match_all($regex, $data, $matches) ?
        array_unique($matches[1]) : array();
}

$urls = getUrls($data);

结果:http: //ideone.com/dblvpA

与:http json_decode: //ideone.com/O8ZixJ

通常你应该使用json_decode.

于 2013-05-30T12:51:14.117 回答