スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

TwitterのつぶやきをTwitterのWebのように表示する

TwitterのつぶやきをTwitterのWebで見ると、httpからはじまる文字列はリンクに、@から始まる文字列はユーザのタイムラインに、#から始まる文字列は検索に飛ぶようになっています。

TwitterのAPIでとってきたつぶやきには、当然このような処理はされておらず、そのまま表示するとリンクの無い文字列だけになってしまいます。
ということで、そういう変換をするプログラムです。

このプログラムの肝はpreg_splitのところでして、httpのリンクを基準に文字列を配列に分解します。
すると配列の偶数はリンク以外、奇数はリンクとして分解されます。
奇数のリンクをaタグで囲ってやれば、リンクとして機能するようになります。

ハッシュタグとアットマークの処理も上のリンクと同じことをしています。
また実体参照についても同様です。

最後はお好みで改行をbrにしてください。

<?php
class Uv_Util {
const RE_LINK = "/(https?:\/\/[a-zA-Z0-9.-]{2,}(:[0-9]+)?(?:\/[_.!~*a-zA-Z0-9;\/?:@&=+$,%#-]+)?\/?)/";
const RE_AT_HASH = "/((?:@|#)[a-zA-Z0-9_]+)/";
const RE_REFER = "/(&#?[a-zA-Z0-9]+;)/";

private static function makeAnchor($url, $content, $target="_blank") {
return '<a target="' . $target . '" href="' . $url . '">
' . $content . '</a>';
}

private static function makeAtHash($str) {
$name = substr($str, 1);
if ('@' === substr($str, 0, 1)) {
return '@' . self::makeAnchor('http://twitter.com/' . $name, $name);
} else {
return self::makeAnchor('http://twitter.com/search?q=%23' . $name, $str);
}
}

private static function makeContentOrCharacterReference($str) {
$result = '';
$strAry = preg_split(self::RE_REFER, $str, -1, PREG_SPLIT_DELIM_CAPTURE);
for ($i = 0; $i < count($strAry); $i++) {
$target = $strAry[$i];
if (0 == $i % 2) {
$result .= htmlspecialchars($target, ENT_QUOTES);
} else {
$result .= $target;
}
}
return $result;
}

private static function escaleOtherLink($str) {
$result = '';
$strAry = preg_split(self::RE_AT_HASH, $str, -1, PREG_SPLIT_DELIM_CAPTURE);
for ($i = 0; $i < count($strAry); $i++) {
$target = $strAry[$i];
if (0 == $i % 2) {
$result .= self::makeContentOrCharacterReference($target);
} else {
$result .= self::makeAtHash($target);
}
}
return $result;
}

public static function escapeTwitter($str) {
if (empty($str)) {
return '';
}
$result = '';
$strAry = preg_split(self::RE_LINK, $str, -1, PREG_SPLIT_DELIM_CAPTURE);
for ($i = 0; $i < count($strAry); $i++) {
$target = $strAry[$i];
if (0 == $i % 2) {
$result .= self::escaleOtherLink($target);
} else {
$result .= self::makeAnchor($target, $target);
}
}
//return nl2br($result);
return $result;
}
}
スポンサーサイト

COMMENTS

COMMENT FORM

TRACKBACK


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。