2011-08-20 61 views
1

即時消息從谷歌請求的網址尋找搜索字詞。 即時通訊使用php正則表達式的問題匹配在谷歌searchterms在網址

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

但是當「Q」參數是字符串的最後一個參數失敗。

,所以我需要獲取後「Q =」在於這一切,但是比賽必須停止,如果它發現「&」

如何做到這一點?

編輯: 我最終降落在這個匹配谷歌請求網址: /[?因爲有時他們有一個以q結尾的參數。像 '水性= 0'

回答

3

您需要/q=([^&]+)/。訣竅是匹配查詢中除&之外的所有內容。

若要建立您的查詢,這是一個稍微修改後的版本,將(幾乎)做到這一點,它是最接近你在那裏:/q=(.*?)(&|$)/。它將q=置於括號之外,因爲在括號內,它將匹配或者其中的一個,而不是兩個在一起,並且最後您需要匹配&或字符串結尾($)。但有一些問題:

  1. 有時候您在比賽結束時會有額外的&;你不需要它。要解決此問題,您可以使用lookahead查詢:(?=&|$)
  2. 它在最後引入了一個額外的組(不一定是壞的,但可以避免) - 實際上,這是固定的1。

所以,如果你想有一個稍長查詢擴展你有什麼就有什麼,那就是:/q=(.*?)(?=&|$)/

+0

+1張貼正確的之前,我有機會改正我的:) –

+0

它不匹配它對我來說:/ 這裏是一個字符串,它應該匹配: 'http://www.google.no/url?sa=t&source=web&cd=3&sqi=2&ved=0CHMQFjAC&url=http%3A%2F%2Fwww.iphonedeksler 。沒有%2Fiphone -4- deksel%2F&RCT = J&q = deksel%20til%20iphone%204&EI = eMVOTpDfBI7DtAaA4cTLBw&USG = AFQjCNEJ2ZqJdBeUw4DcgETEPr0z3z18NA' 和另一它應該匹配: 'http://www.google.no/url?sa=t&source=幅和CD = 3&SQI = 2&VED = 0CHMQF jAC&url = http%3A%2F%2Fwww.iphonedeksler.no%2Fiphone-4-deksel%2F&rct = j && ei = eMVOTpDfBI7DtAaA4cTLBw&usg = AFQjCNEJ2ZqJdBeUw4DcgETEPr0z3z18NA&q = deksel%20til%20iphone%204' ..但這個線程到目前爲止沒有任何東西匹配。 –

+0

@Kristian Rafteseth很奇怪,它在我的正則表達式http://gskinner.com/RegExr/中工作。它應該與preg_match一起工作,我會在鍵盤上嘗試它。 –

0

試試這個:

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

一點解釋:

  • [q=]將搜索要麼q=,卻接連而不是一個。
  • [&]不需要,因爲只有一個字符。 &很好。
  • ?運算符在正則表達式中指示它匹配0或1發生**之前的**字符。
  • [^&]會告訴它匹配任何字符除了&。這意味着你會得到所有的查詢字符串,直到它遇到&。