twitterからRSSをひっぱってきてモフモフする時って、
ブログからひっぱってくる時と事情が違う。
一緒なんだけども、「@….」「#….」とかね、タイムラインではリンクになってますよね。
今回はPHPでTwitterからRSSでひっぱってきて、@も#も全部リンクにすることが出来るかなぁ、という勉強。
正規表現は難しい。というかややこしい。僕にとって。
わかりやすいサイトを教えてもらったので、参考にそこを読む。
さるにもわかる正規表現
まずはXML_RSSでRSSを取得しパース
$tweet=&new XML_RSS($tweet_url);
$tweet->parse();
getItems()で中身を取り出す
foreach($tweet->getItems() as $item){
$item['description']=mb_convert_encoding($item['description'],'UTF-8','auto');
$item['description']=mb_substr($item['description'],6);
$pat=array("/(https?)(:\/\/[[:alnum:]\+\$\;\?\.%,!#~*\/:@&=_-]+)/i");
$_user=array("/(@)([[:alnum:]_]+)/");
$_search=array("/(#)([[:alnum:]_]+)/");
$replacements = array("<a href=\"\\1\\2\"?phpMyAdmin=f59fa711f0e26091bc5c43fe01778ab9>\\1\\2</a>");
$replacements2 = array("\\1<a href=\"http://twitter.com/\\2\">\\2</a>");
$replacements3 = array("<a href=\"http://twitter.com/search?q=%23\\2\">\\1\\2</a>");
$item['description']= preg_replace($pat, $replacements, $item['description']);
$item['description']= preg_replace($_user, $replacements2, $item['description']);
$item['description']= preg_replace($_search, $replacements3, $item['description']);
$item['list']="<li class=\"grid twitter_li\">";
}
色々調べながらやってみました。時間かかったけど。
$pat、$_user、$_searchがマッチさせたい文字列です。
$pat=array("/(https?)(:\/\/[[:alnum:]\+\$\;\?\.%,!#~*\/:@&=_-]+)/i");
各項目内の[:alnum:]はアルファベット・数字全部、()は文字列のグループ化。
「?」は「直前の文字が1つ、もしくは0つ」ということみたいです。
(https?)、はつまり「httpかhttps」がマッチ、ということになります。
[]は「[]ないどれか1つ」で、+は「最低1つ直前の文字があることで同じ文字の繰り返し」ですか。
ふー
「同じ文字の繰り返し」なのですが、[]内の文字の繰り返し、っていうことになるのですね。
$replacementsは置き換える文字列です。
$replacements = array("<a href=\"\\1\\2\"?phpMyAdmin=f59fa711f0e26091bc5c43fe01778ab9>\\1\\2</a>");
「\”」は”のエスケープで、「\\1\\2」はグループ化された$patの文字列部分をあらわしています。
なので
http://www.takasumi-nagai.com/
があるとしたら、
(http) \\1
(://www.takasumi-nagai.com/) \\2
ということになる(ぼんやりしかわかってないけど・・・)
なんしか、これで出来ました。
難しいですね。正規表現。
私のサイトトップで実装してます。
ちゃんと動いているみたいですね。
良かった。