2009-10-03 14 views
0

J'ai écrit la classe Link qui a une méthode shortTolong() qui devrait renvoyer l'URL réelle d'une URL raccourcie en retournant l'en-tête de réponse 'location'. Je l'ai testé et il fonctionne OK voici le codeimpossible de faire fonctionner la méthode de classe à l'intérieur foreach loop - php

public function shortTolong() 
    { 
     $urlMatch = array(); 
     $ch = curl_init(); 

     $options = array 
     (
      CURLOPT_URL=>$this->getUrl(), 
      CURLOPT_HEADER=>true, 
      CURLOPT_RETURNTRANSFER=>true, 
      CURLOPT_FOLLOWLOCATION=>false, 
      CURLOPT_NOBODY=>true); 
     curl_setopt_array($ch, $options); 
     $server_output = curl_exec($ch); 
     preg_match_all(LINK, $server_output,&$urlMatch,PREG_SET_ORDER); 
     if($urlMatch) 
     { 
      foreach($urlMatch as $set) 
      { 
       $extracted_url = $set[2].'://'.$set[3]; 
      } 
      return $extracted_url; 
     } 
     else 
     { 
      return $this->getUrl(); 
     } 
    } 

le problème commence lorsque je tente d'utiliser cette méthode sur un autre fichier qui utilise feedparser pour obtenir des entrées d'alimentation contenant ce court urls i ned d'analyser de certains raison pour laquelle je reçois un résultat court url au lieu de la longue est ici le code:

foreach($parser->getItems() as $item) 
{ 
    $idpreg = '/\d+/'; 
    preg_match_all($idpreg, $item['ID'],$statusid); 
    $retweetid = ($statusid[0][1]); 
    $datetime = $item['PUBLISHED']; 
    $user = $item['AUTHOR']['NAME']; 
    preg_match_all(LINK, $item['TITLE'], &$linkMatch); 
    $final = $linkMatch[0][0]; 
    //if($linkMatch[0][0]) 
     echo '<p>'; 
     $link = new Link($final); 
     echo $link->getUrl(); 
     echo '<br>'; 
     echo $link->shortTolong(); 
     echo '<br>'; 
     echo $user; 
     echo '<br>'; 
     echo $retweetid; 
     echo '</p>'; 


} 

de quelque raison que je reçois le même résultat pour getUrl() et shortTolong() et je sais que pour certains cela est un Erreur.

des idées pourquoi cela se passe-t-il? Merci

Modifier- j'ai ajouté un avis d'erreur à la méthode avec curl_eror je reçois ce message d'erreur: « protocole HTTP non pris en charge ou désactivé dans libcurl » comme je l'ai dit je l'ai testé cette méthode à et il fonctionne très bien comme comme seul dans le même environnement (pas de changements) je soupçonne que cela a quelque chose à voir avec FeedParser en utilisant curl aussi ....

+0

avez-vous essayé echo $ server_output = curl_exec ($ ch); ?? Est-ce que cela imprime une sortie? –

+0

mettre une garniture sur l'URL et voir si cela aide. –

+0

sab - merci de répondre $ server_output génère les en-têtes de réponse de l'URL comme prévu pouvez-vous expliquer pourquoi pensez-vous que trim() serait utile? comme je l'ai dit cette méthode fonctionne très bien quand je l'ai testé sur le problème de l'objet généré statique commence lorsque l'objet est lancé dynamiquement avec feedparser –

Répondre

1

Je pense que vous devriez couper() l'URL et cela devrait résoudre le problème.

+0

ok donc pas sûr ... ur modifier "Protocole HTTP non supporté ou désactivé dans libcurl" .. quand est-ce que ça arrive? si elle se présente lorsque vous demandez à partir de la boucle d'alimentation .. les chances sont l'url a des choses supplémentaires autour de lui que vous ne pouvez pas voir .. essayer .. sinon .. il n'y a aucune raison pour que cela se produise comme il est passe .. aussi son bon d'envoyer explicitement curl_close ($ ch); après la demande est terminée –

+0

Sab - je suppose que je vous dois un s'excuser :) bien que je doutais de la solution trim(), il a travaillé comme un charme! - LE RESPECT! –

+0

Je suis content que ça a marché pour toi :) –