用于在网址中匹配google searchterms的php正则表达式问题

时间:2011-08-20 10:12:51

标签: php regex

我正在从谷歌请求网址中找到搜索词。 我正在使用

preg_match("/[q=](.*?)[&]/", $requesturl, $match);

但是当'q'参数是字符串的最后一个参数时它会失败。

所以我需要获取'q ='之后的所有内容,但匹配必须在找到'&'时停止

怎么做?

编辑: 我最终登陆这个以匹配谷歌请求网址:     / [?&安培;] Q =([^&安培;] +)/ 因为有时他们有一个以q结尾的参数。比如'aq = 0'

2 个答案:

答案 0 :(得分:3)

您需要/q=([^&]+)/。诀窍是匹配查询中除&之外的所有内容。

要构建您的查询,这是一个稍微修改过的版本,它将(几乎)完成这一操作,并且它与您拥有的最接近:/q=(.*?)(&|$)/。它将q=放在括号内,因为在括号内它将匹配 ,而不是两者一起,最后你需要匹配&或字符串的结尾($)。但是,有一些问题:

  1. 有时候你会在比赛结束时额外增加&;你不需要它。要解决此问题,您可以使用lookahead查询:(?=&|$)
  2. 它最后引入了一个额外的组(不一定是坏的,但可以避免) - 实际上,这是由1修复的。
  3. 因此,如果您想要稍微长一点的查询来扩展您的内容,请点击此处:/q=(.*?)(?=&|$)/

答案 1 :(得分:0)

试试这个:

preg_match("/q=([^&]+)/", $requesturl, $match);

一点解释:

  • [q=]会搜索 q=,但不会一个接一个地搜索。
  • 因为只有一个字符,所以不需要
  • [&]&没问题。
  • 正则表达式中的?运算符告诉它匹配**前面**字符的 0或1 次出现。
  • [^&]会告诉它匹配&之外的任何字符。这意味着您将获得所有查询字符串,直到它达到&。