【问题标题】:PHP delimiter with explode multiple具有爆炸倍数的 PHP 分隔符
【发布时间】:2012-09-25 06:59:11
【问题描述】:

我正在编写一个简单的“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 创建一个数组,它会过滤掉除所需结果之外的所有内容:即“blogging+for+answers”。文本文件包含很多垃圾,我只想将结果保留在每个 ?q=& 符号之间。

据我所知,没有一个简单的解析器可以从 URL 字符串中提取参数数据。

$q[0] = "blogging+for+answers"
每次我只用 ?q= 使用爆炸时,它都会占用整个文本直到下一次出现 ?q=,我只希望它直到 &

【问题讨论】:

  • 使用 PHP 中的 parse_str 等函数解析 URL!
  • 您正在解析整个页面或只是 URL。因为“下一次出现 ?q=' 意味着整个页面。

标签: php explode


【解决方案1】:

使用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 只会解析一个 url。
  • 是的。所以他想用 preg_match 之类的东西从他的日志中提取每个 url,然后将 parse_url 和 parse_str 应用于生成的 url。
  • 我就是这么想的。你可以在下面用“-2”看到答案:)
  • 我正在使用 file_get_contents() 解析整个文件。那么我将如何使用 preg_match 从文件中的每个实例获取整个 URL 并将 url 分配给不同的数组变量?我要做的是创建一个数组,您可以轻松地 print_r 并快速查看所有关键字匹配项。
  • 这是 url %^((https?://)|(www\.))([a-z0-9-].?)+(:[0-9 ]+)?(/.*)?$%i 但是你有没有试过我下面的代码。它只会返回每个字符串的关键字匹配。我测试过了。
【解决方案2】:

试试parse_url()

以下是相同的代码:

<?php
    $url = 'http://username:password@hostname/path?arg=value#anchor';
    print_r(parse_url($url));
    echo parse_url($url, PHP_URL_PATH);
?>

【讨论】:

    【解决方案3】:

    这会给你 $q 作为你上面描述的数组。

    $file = file_get_contents($filename);
    preg_match_all("/http[^'\" ]*[?][^'\" ]*[&]q[=]([^'\"& ]*)/",$file ,$matches);
    
    foreach($matches as $match)
         $q[] = $match[1];
    

    编辑

    解释这个表达式的作用。这将找到http*****?****&amp;q=(result)[&amp;'" ] 的每次出现,然后将 $matches 作为每次出现的数组返回。该表达式还检查没有空格或引号,然后它不会添加到 $matches

    【讨论】:

    • 我不明白为什么这被否决了。是因为它没有解释正则表达式的工作原理吗?正则表达式对于不熟悉正则表达式的人来说显然不是很明显,但这是一个完全有效的答案。
    • 你是对的,所以我对其进行了解释。我曾经是一个 Perl 人,所以 reg exp 是给定的。
    猜你喜欢
    • 1970-01-01
    • 2011-06-24
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多