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 );
}

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

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2014/12/19 01:40:03

回答1件)

id:rouge_2008 No.1

回答回数595ベストアンサー獲得回数351

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

$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>';
}

他3件のコメントを見る
id:rouge_2008

すべてのタグがリンクになるという事ですか?
表示確認している箇所で繋げると、存在しないハッシュは変換されないはずですが・・・

	echo $hash .'<br>';

上記を以下の記述に変更します。

	$text .= ' ' .$hash;

結果を確認したい場合は、foreachの処理完了後の部分で$textを出力してみてください。

半角スペースの有無まで元の形で残す必要があるのでしょうか?
半角スペース1つ空けるか、あるいはスペースなしで連続にするか統一するなど、運用で対処した方がいいと思います。
上記のコードでは半角スペースに統一されます。

2014/12/12 19:49:26
id: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);

2014/12/12 22:41:08
id:sakura_mongo

正規表現を使って行いました。

変数$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;

}

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

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

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません