我正在编写一个简单的"httpref"程序,该程序将搜索引擎响应捕获到一个大文本文件中。例如,日志文件包含大量数据,并且每隔一段时间就会有一个?q=
以&
终止:
http://www.bing.com/search?q=blogging+for+answers&qs=n&form=QBRE&pq=blogging+for+answers&sc=8-18&sp=-1&sk=
我想做的是使用 explode 创建一个数组,它过滤掉除所需结果之外的所有内容:即"博客+for+答案"。文本文件包含很多垃圾,我只想保留每个?q=
和&
符号之间的结果。
据我所知,没有一个简单的解析器可以从 URL 字符串中提取参数数据。
即 $q[0] = "blogging+for+answers"
每次我只使用爆炸?q=
它都会占用整个文本直到下一次出现?q=
,我只希望它直到&
使用 parse_url
获取查询字符串组件以及提取所需查询字符串变量的parse_str
。
<?
$url = "http://www.bing.com/search?q=blogging+for+answers&qs=n&form=QBRE&pq=blogging+for+answers&sc=8-18&sp=-1&sk=";
$querystring = parse_url($url,PHP_URL_QUERY);
parse_str($querystring,$arr);
echo $arr['q'];
?>
尝试parse_url()
.
以下是相同的代码:
<?php
$url = 'http://username:password@hostname/path?arg=value#anchor';
print_r(parse_url($url));
echo parse_url($url, PHP_URL_PATH);
?>
这将为您提供如上所述的数组$q。
$file = file_get_contents($filename);
preg_match_all("/http[^'" ]*[?][^'" ]*[&]q[=]([^'"& ]*)/",$file ,$matches);
foreach($matches as $match)
$q[] = $match[1];
编辑
解释此表达式的作用。这将查找每次出现的http*****?****&q=(result)[&'" ]
,然后将$matches作为每次出现的数组返回。 表达式还检查没有空格或引号,然后它不会添加到$matches
<?php
function multiexplode ($delimiters,$data) {
$MakeReady = str_replace($delimiters, $delimiters[0], $data);
$Return = explode($delimiters[0], $MakeReady);
return $Return;
}
$data = "Ami jani na, amita maybe-tomar () kam";
$Exploded = multiexplode(array(", ","-"," () "),$data);
echo"<PRE>"; print_r($Exploded); echo"</PRE>";
?>
Array
(
[0] => Ami jani na
[1] => amita maybe
[2] => tomar
[3] => kam
)