2010-11-25 14 views
1

Bonjour J'essaie d'afficher le dernier tweet en utilisant le code ci-dessous. Ce preg_replace fonctionne très bien pour envelopper un lien autour de twitter @usernames mais ne fonctionne pas pour les adresses web dans les tweets. Comment puis-je obtenir ce code pour envelopper les liens autour des URL dans les tweets.Wrap lien autour des liens dans les tweets avec php preg_replace

 <?php 
     /** Script to pull in the latest tweet */ 
     $username='fairgroceruk'; 
     $format = 'json'; 
     $tweet = json_decode(file_get_contents("http://api.twitter.com/1/statuses/user_timeline/{$username}.{$format}")); 
     $latestTweet = htmlentities($tweet[0]->text, ENT_QUOTES); 
     $latestTweet = preg_replace('/@([a-z0-9_]+)/i', '<a href="http://twitter.com/$1" target="_blank">@$1</a>', $latestTweet); 
     $latestTweet = preg_replace('/http://([a-z0-9_]+)/i', '<a href="http://$1" target="_blank">http://$1</a>', $latestTweet); echo $latestTweet; 

    ?> 

Merci pour l'aide,

Ben

Répondre

0

Principalement parce que l'expression régulière n'est pas valide - il y a un/au milieu de celui-ci.

Modifiez le délimiteur à quelque chose d'autre, comme si, pour arrêter le // dans le milieu entrant en collision:

$latestTweet = preg_replace('~http://([a-z0-9_]+)~i', '<a href="http://$1" target="_blank">http://$1</a>', $latestTweet); echo $latestTweet; 

Notez que vous n'avez pas explicitement d'utiliser ~, mais il est beaucoup moins couramment utilisé dans les expressions régulières (au moins dans mon expérience) que/finit par être.

Comme alternative, vous pouvez échapper à la // partie:

$latestTweet = preg_replace('/http:\/\/([a-z0-9_]+)/i', '<a href="http://$1" target="_blank">http://$1</a>', $latestTweet); echo $latestTweet; 
+0

ceux-ci ne semblent pas travailler ... –

+0

Eh bien, il est toujours utile de savoir ce que ce sujet ne fonctionne pas, par opposition à « ne fonctionne pas ». J'ai juste testé le premier, et j'ai réalisé que l'expression régulière originale est en fait cassée - pas à cause de l'échappement/mais simplement parce que plus de caractères peuvent être dans les URLs. Le bit [] doit être au strict minimum: ([a-z0-9 _ \. \ - \ + \ & \! \ # \ ~ \,] +) - et ce n'est toujours pas tous les caractères d'URL légaux, juste un bon sous-ensemble d'entre eux. – Arantor

+0

Désolé c'est difficile à expliquer mais le problème semble être que si vous avez un @twitterUsername dans l'URL comme le premier preg_replace échappe deux fois et finit un désordre mélangé par le deuxième preg_replace –

1

J'ai ajouté une période et un backslash si le lien est tout reconnu. Avec le code ci-dessus, il ne faisait que lire le lien jusqu'au point. Tant qu'il y a un espace entre votre lien et le reste du texte, cette expression régulière devrait fonctionner.

$text = preg_replace('/http:\/\/([a-z0-9_.\/]+)/i', '<a href="http://$1"  target="_blank">http://$1</a>', $text);