【PHP】TwitterのアカウントやURLをaタグに置換する正規表現

TwitterのつぶやきをAPI経由で取得して表示するwordpressのプラグインを作ったけど、つぶやき内のURLがリンクになったり、ならなかったりしたので、正規表現を見直したときのメモ。

元にしたのはここにある正規表現。

これを日本語用に直したのがこれ。

function wp_twitter_client_convertlink($tweet)
{
	$tweet= preg_replace("#(^|[\s\"\[<(( ])([\w]+?://[\w]+[^\s\"\]>)) ]*)#", "\\1<a href=\"\\2\" target=\"_blank\">\\2</a>", $tweet);
	$tweet= preg_replace("#(^|[\s\"\[<(( ])((www|ftp)\.[^\s\"\]>)) ]*)#", "\\1<a href=\"http://\\2\" target=\"_blank\">\\2</a>", $tweet);
	$tweet= preg_replace("/@(\w+)/", "<a href=\"http://www.twitter.com/\\1\" target=\"_blank\">@\\1</a>", $tweet);
	$tweet= preg_replace("/#(\w+)/", "<a href=\"http://search.twitter.com/search?q=\\1\" target=\"_blank\">#\\1</a>", $tweet);
	return $tweet;
}

全角スペースとか全角カッコとかあるので、ファイルの文字コードを気をつける必要がある。

さらにガチャピンとかが結構長いURLをつぶやくので、teniteoのトップページみたいなレイアウトの場合崩れたりする。

なので長いURLの場合はpreg_replace_callbackを使って置換するようにした。

/**
 * convert link to click able
 *
 * @param  string $tweet 
 * @return string        
 */
function wp_twitter_client_convert_link($tweet)
{
	$tweet= preg_replace_callback("#(^|[\s\"\[<(( ])([\w]+?://[\w]+[^\s\"\]>)) ]*)#", "wp_twitter_client_replace_url", $tweet);
	$tweet= preg_replace_callback("#(^|[\s\"\[<(( ])((www|ftp)\.[^\s\"\]>)) ]*)#", "wp_twitter_client_replace_url", $tweet);
	$tweet= preg_replace("/@(\w+)/", "<a href=\"http://www.twitter.com/\\1\" target=\"_blank\">@\\1</a>", $tweet);
	$tweet= preg_replace("/#(\w+)/", "<a href=\"http://search.twitter.com/search?q=\\1\" target=\"_blank\">#\\1</a>", $tweet);
	return $tweet;
}

/**
 * call by preg_replace_callback in wp_twitter_client_convert_link
 *
 * @param  string $matches 
 * @return string        
 */
function wp_twitter_client_replace_url($matches)
{
	return $matches[1] . '<a href="' . $matches[2] . '" target="_blank">' . mb_strimwidth($matches[2], 0, 35, '...', 'utf8') . '</a>';
}

これでクリックできないリンク(つぶやき)があったら教えてほしい。

 

<関連記事>

【PHP】Twitter APIで特定のツイートに対する返信を取得する
[PHP]PEARのServices_Twitterでつぶやいたり取得したり