人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPでプログラミングをしています。ある変数$textのハッシュタグの内容をリンクに置き換えたいと思っています。
変数$textの中身が以下のような時どのようなプログラムを組んだらいいでしょうか?

「あああああ #ああ#あい#あう#あえ#あお#あか #ああい #か」

この変数$textのハッシュタグの内容には日本語や英語だけでなく、その他の言語の文字(ハングルやアラビア文字など)でハッシュタグを作ってある場合があります。またハッシュタグは。「#ああ#あい」の様にくっついていても
「#ああ #あい」の2つのハッシュタグとして判別したいです。

現状は、変数$tagsに配列でハッシュタグの情報が入っているので以下のようにしていますが、#ああい のハッシュタグを#ああ のハッシュタグで二重に書き換えてしまったりしています。
usort($tags, create_function('$tags,$b', 'return mb_strlen($b, "UTF-8") - mb_strlen($tags, "UTF-8");'));
for ($i = 0 ; $i < count($tags); $i++){
$text = str_ireplace('#'.$tags[$i], '<a href="http://aaa.com/'.$tags[$i].'">#'.$tags[$i].'</a>', $text );
}

よろしくお願い致します。


●質問者: sakura_mongo
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● rouge_2008

ハッシュごとに分割してから処理すると、二重書き換えに対処できると思います。

$tags = array("ああい", "あい", "あお", "あか", "か", "き", "すみ");
$text = "あああああ #ああ#あい#あう#あえ#あお#あか #ああい #か #き #すみ";

// 分割
$hashs = preg_split("/[\s#]+/", $text);
// テキストとハッシュに分割
$text = array_shift($hashs);

foreach($hashs as $hash) {
if(in_array($hash, $tags)) {
$hash = str_ireplace($hash, '<a href="http://example.jp/'.$hash.'">#'.$hash.'</a>', $hash);
}
echo $hash .'<br>';
}


sakura_mongoさんのコメント
処理結果として、$textの内容が、 "あいう #ああ#あい"だったとすると"あいう <a href="http://aaa.jp/ああ">#ああ</a><a href="http://aaa.jp/あい">#あい</a>"という形に置き換えたいです。上のままだと、$textの内容が、 array_shiftを使っているので"あああああ"だけで、foreach後の$hashの内容は、"<a href="http://aaa.jp/あい">#あい</a>"となってしまって、"あいう #ああ#あい"という結果にならないです。 まだ、ソースをあまり理解してないのでもう少し見てみます。 ありがとう御座いました。

rouge_2008さんのコメント
分割後のテキストは$textに残してあります。 処理後の$hashを$textに繋げていくと希望通りの結果になると思います。

sakura_mongoさんのコメント
$hashのを$textにつなげていくと全部変換全部変換されて表示されました。 ただ、$textの内容が"ああ #あい"を変換すると"ああ<a href="http://example.jp/ああ">#ああ</a>"と変換されると思うんですが、この変換後の内容がこのプログラムだと変換前の$text"ああ #あい"であった「ああ」と「#あい」との間にあった半角スペースがなくなってしまうと思うんですが、このスペースを残す方法ってありますかね。。 はてなポイントも無いのに何度もすみません。

rouge_2008さんのコメント
すべてのタグがリンクになるという事ですか? 表示確認している箇所で繋げると、存在しないハッシュは変換されないはずですが・・・ >|| echo $hash .'<br>'; ||< 上記を以下の記述に変更します。 >|| $text .= ' ' .$hash; ||< 結果を確認したい場合は、foreachの処理完了後の部分で$textを出力してみてください。 半角スペースの有無まで元の形で残す必要があるのでしょうか? 半角スペース1つ空けるか、あるいはスペースなしで連続にするか統一するなど、運用で対処した方がいいと思います。 上記のコードでは半角スペースに統一されます。

rouge_2008さんのコメント
リンクにはなりませんが、「#」がなくなりますね・・・ 「else」で存在しないタグ用の処理を追加してください。 >|| foreach($hashs as $hash) { if (in_array($hash, $tags)) { $hash = str_ireplace($hash, '<a href="http://example.jp/'.$hash.'">#'.$hash.'</a>', $hash); }else{ $hash = '#' . $hash; ; } $text .= ' ' . $hash; } ||< 正規表現を使う場合、「#」以外の文字列で判断するのが簡単だと思います。 (※タグの存在の有無が完了している事が前提で、置換処理の部分だけです。) >|| $text = preg_replace('/#([^\s#]+)/u', '<a href="http://example.jp/$1">#$1</a>', $text); ||<

質問者から

正規表現を使って行いました。
変数$textの値が「あああああ #ああ#あい#あう#あえ#あお#あか #ああい #か」の値が入っているとして

echo $convert_link = convert_link($text);

function convert_link($text)
{
$text= preg_replace("/#(w*[一-龠_ぁ-ん_ァ-ヴー_]+|[a-zA-Z0-9_]+|[a-zA-Z0-9_]w*)/u", "#\\1", $text);
return $text;
}

で日本語とアルファベットのハッシュタグが変換されました。

正規表現を使う場合、外国の文字(ロシア語、アラビア語、ハングル等)は、どのように表現したらいいのでしょうか??


関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ