【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>'; }
これでクリックできないリンク(つぶやき)があったら教えてほしい。
<関連記事>