正規表現のお勉強
twitterからRSSをひっぱってきてモフモフする時って、
ブログからひっぱってくる時と事情が違う。
一緒なんだけども、「@….」「#….」とかね、タイムラインではリンクになってますよね。
今回はPHPでTwitterからRSSでひっぱってきて、@も#も全部リンクにすることが出来るかなぁ、という勉強。
正規表現は難しい。というかややこしい。僕にとって。
わかりやすいサイトを教えてもらったので、参考にそこを読む。
まずはXML_RSSでRSSを取得しパース
1 2 | $tweet=&new XML_RSS($tweet_url); $tweet->parse(); |
getItems()で中身を取り出す
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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\">\\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がマッチさせたい文字列です。
1 |
各項目内の[:alnum:]はアルファベット・数字全部、()は文字列のグループ化。
「?」は「直前の文字が1つ、もしくは0つ」ということみたいです。
(https?)、はつまり「httpかhttps」がマッチ、ということになります。
[]は「[]ないどれか1つ」で、+は「最低1つ直前の文字があることで同じ文字の繰り返し」ですか。
ふー
「同じ文字の繰り返し」なのですが、[]内の文字の繰り返し、っていうことになるのですね。
$replacementsは置き換える文字列です。
1 |
「\”」は”のエスケープで、「\\1\\2」はグループ化された$patの文字列部分をあらわしています。
なので
1 | http://www.takasumi-nagai.com/ |
があるとしたら、
1 2 | (http) \\1 (://www.takasumi-nagai.com/) \\2 |
ということになる(ぼんやりしかわかってないけど・・・)
なんしか、これで出来ました。
難しいですね。正規表現。
私のサイトトップで実装してます。
ちゃんと動いているみたいですね。
良かった。