2009-11-26 3 views
7

Ich versuche, das Suchschlüsselwort von einer Referrer-URL zu bekommen. Derzeit verwende ich den folgenden Code für Google-URLs. Aber manchmal funktioniert es nicht ...Erhalten Sie ein Schlüsselwort von einer (Suchmaschine) Referrer URL mit PHP

$query_get = "(q|p)"; 
$referrer = "http://www.google.com/search?hl=en&q=learn+php+2&client=firefox"; 
preg_match('/[?&]'.$query_get.'=(.*?)[&]/',$referrer,$search_keyword); 

Gibt es einen anderen/sauberen/Arbeitsweg, dies zu tun?

Danke, Prasad

Antwort

14

Wenn Sie PHP5 einen Blick auf http://php.net/parse_url und http://php.net/parse_str

Beispiel für die Verwendung sind:

 

// The referrer 
$referrer = 'http://www.google.com/search?hl=en&q=learn+php+2&client=firefox'; 

// Parse the URL into an array 
$parsed = parse_url($referrer, PHP_URL_QUERY); 

// Parse the query string into an array 
parse_str($parsed, $query); 

// Output the result 
echo $query['q']; 
+0

Vielen Dank für die schnelle Antwort ... – pnm123

+0

Kein Problem, wenn Sie Ihre Frage bitte klicken Sie auf den Scheck unter der richtigen Antwort beantwortet wird, so Jeder weiß, dass es beantwortet ist. – William

+0

PHP_URL_QUERY funktioniert nicht, da das neue "ajax'd" google ein '#' verwendet, um die Domäne von der Abfragezeichenfolge zu trennen und nicht ein '?'. Sie erhalten also ein leeres Array - ein Work around könnte darin bestehen, die erste Instanz eines '#' zu einem '?' Zu finden und zu ersetzen. in der URL vor der Verarbeitung –

0
$query = parse_url($request, PHP_URL_QUERY); 
+1

Mein Beitrag aktualisiert, um den zweiten Parameter hinzuzufügen. Ich hatte gehofft, er würde die Methode nachschlagen, um zu sehen, wie es alleine funktioniert, aber naja. – William

1

Es gibt verschiedene Abfrage-Strings auf unterschiedliche Such Motoren. Nachdem ich Wiliams Methode ausprobiert habe, habe ich meine eigene Methode herausgefunden. (Weil, Yahoo wird mit 'p', aber manchmal 'q')

$referrer = "http://search.yahoo.com/search?p=www.stack+overflow%2Ccom&ei=utf-8&fr=slv8-msgr&xargs=0&pstart=1&b=61&xa=nSFc5KjbV2gQCZejYJqWdQ--,1259335755"; 
$referrer_query = parse_url($referrer); 
$referrer_query = $referrer_query['query']; 
$q = "[q|p]"; //Yahoo uses both query strings, I am using switch() for each search engine 
preg_match('/'.$q.'=(.*?)&/',$referrer,$keyword); 
$keyword = urldecode($keyword[1]); 
echo $keyword; //Outputs "www.stack overflow,com" 

Danke, Prasad

+0

In meinem Beispiel könnten Sie auch überprüfen, ob der Array-Schlüssel q oder p vorhanden ist, und wenn ja, verwenden Sie das anstelle des anderen. Um ehrlich zu sein, empfehle ich, die Domain, von der sie kommt, zu überprüfen und mit den darauf basierenden Daten zu arbeiten. Im Moment würde JEDER, der von einer beliebigen Seite mit "q" oder "p" kommt, so aussehen, als käme er von Google/Yahoo. – William

+0

Um das zu verhindern, verwende ich das >>> if (preg_match ('/ [\.\ /] (google | yahoo | bing | geegain | mywebsearch | fragen | alltheweb) \. [az \.] {2,5} [\ /]/i ', $ referrer, $ search_engine)) {<<< – pnm123

+0

pnm123 solution findet jedes Element, das p = ist, das cp = - enthält, was google url hat, was nicht zu der Abfragezeichenfolge für die Schlüsselwörter führt. –

0

Dieser sollte für Google, Bing arbeiten und manchmal, Suche Yahoo:

if(isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER']) { 
    $query = getSeQuery($_SERVER['HTTP_REFERER']); 
    echo $query; 
} else { 
    echo "I think they spelled REFERER wrong? Anyways, your browser says you don't have one."; 
} 



function getSeQuery($url = false) { 
    $segments = parse_url($url); 
    $keywords = null; 
    if($query = isset($segments['query']) ? $segments['query'] : (isset($segments['fragment']) ? $segments['fragment'] : null)) { 
    parse_str($query, $segments); 
    $keywords = isset($segments['q']) ? $segments['q'] : (isset($segments['p']) ? $segments['p'] : null); 
    } 
    return $keywords; 
} 
1

Um die anderen Antworten zu ergänzen, beachten Sie, dass der Abfragezeichenfolgenparameter, der die Suchbegriffe enthält, nach Suchanbieter variiert. Dieser Code-Schnipsel von PHP zeigt den richtigen Parameter zu verwenden:

$search_engines = array(
    'q' => 'alltheweb|aol|ask|ask|bing|google', 
    'p' => 'yahoo', 
    'wd' => 'baidu', 
    'text' => 'yandex' 
); 

Quelle: http://betterwp.net/wordpress-tips/get-search-keywords-from-referrer/

1
<?php 
class GET_HOST_KEYWORD 
{ 
    public function get_host_and_keyword($_url) { 
     $p = $q = ""; 
     $chunk_url = parse_url($_url); 
     $_data["host"] = ($chunk_url['host'])?$chunk_url['host']:''; 
     parse_str($chunk_url['query']); 
     $_data["keyword"] = ($p)?$p:(($q)?$q:''); 
     return $_data; 
    } 
}  
// Sample Example 
$obj = new GET_HOST_KEYWORD(); 
print_r($obj->get_host_and_keyword('http://www.google.co.in/search?sourceid=chrome&ie=UTF-&q=hire php php programmer')); 

// sample output 
//Array 
//(
// [host] => www.google.co.in 
// [keyword] => hire php php programmer 
//) 

// $search_engines = array(
// 'q' => 'alltheweb|aol|ask|ask|bing|google', 
// 'p' => 'yahoo', 
// 'wd' => 'baidu', 
// 'text' => 'yandex' 
//); 


?> 
0

Ich glaube, Google und Yahoo ihren Algorithmus aktualisiert hatte Suchbegriffen und andere params in der URL auszuschließen, das nicht sein kann empfangen mit http_referrer-Methode.

Bitte lassen Sie mich wissen, ob die obigen Empfehlungen weiterhin die Suchbegriffe enthalten.

Was ich jetzt empfange, sind unten, wenn Sie den http Referrer auf meiner Webseite verwenden.

von Google: https://www.google.co.in/ von Yahoo: https://in.yahoo.com/

Ref: https://webmasters.googleblog.com/2012/03/upcoming-changes-in-googles-http.html