2010-11-25 9 views
1

こんにちは、私は以下のコードを使って最新のつぶやきを表示しようとしています。このpreg_replaceはtwitter @usernamesのリンクをラップするのには効果的ですが、つぶやきのWebアドレスでは機能しません。つぶやきのURLの周りにこのコードをラップするにはどうすればいいですか?助けのためのつぶやきのリンクをリンクしたリンクがあります。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; 

    ?> 

おかげで、

ベン

答えて

0

正規表現は有効なものではありません主な理由 - /は、それの真ん中にあります。

どちらの真ん中衝突に//を停止するには、そのように、何か他のものに区切り文字を変更します。

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

注意明示的に〜を使用する必要はありませんが、それははるかに一般的に使用されます正規表現で(少なくとも私の経験では)/終わっている。

別の方法として、あなたは//一部を逃れることができます。

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

これらまあ、それはそれは動作しません "とは対照的に、何それは動作しません知って、常に便利です –

+0

...動作するようには思えません。私はちょうど最初のものをテストし、元の正規表現が実際に壊れていることに気付きました - エスケープのためではなく、より多くの文字がURLにある方法があるからです。 []ビットは最低限必要です:([a-z0-9 _ \。\ - \ + \&\!\#\〜\、] +) - これは、彼らの良いサブセット。 – Arantor

+0

申し訳ありませんが説明するのは難しいですが、問題は、最初のpreg_replaceが2回エスケープされ、2番目のpreg_replaceによって混乱を招くことになる場合は、URLに@twitterUsernameがあると思われます。 –

1

は私が期間全体のリンクが認識されるようにエスケープバックスラッシュを追加しました。上のコードでは、ドットまでリンクを読むだけでした。あなたのリンクとテキストの残りの部分の間にスペースがある限り、この正規表現は機能するはずです。

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