変数$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 );
}
よろしくお願い致します。
ハッシュごとに分割してから処理すると、二重書き換えに対処できると思います。
$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>'; }
正規表現を使って行いました。
変数$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;
}
で日本語とアルファベットのハッシュタグが変換されました。
正規表現を使う場合、外国の文字(ロシア語、アラビア語、ハングル等)は、どのように表現したらいいのでしょうか??
すべてのタグがリンクになるという事ですか?
表示確認している箇所で繋げると、存在しないハッシュは変換されないはずですが・・・
上記を以下の記述に変更します。
結果を確認したい場合は、foreachの処理完了後の部分で$textを出力してみてください。
2014/12/12 19:49:26半角スペースの有無まで元の形で残す必要があるのでしょうか?
半角スペース1つ空けるか、あるいはスペースなしで連続にするか統一するなど、運用で対処した方がいいと思います。
上記のコードでは半角スペースに統一されます。
リンクにはなりませんが、「#」がなくなりますね・・・
「else」で存在しないタグ用の処理を追加してください。
正規表現を使う場合、「#」以外の文字列で判断するのが簡単だと思います。
2014/12/12 22:41:08(※タグの存在の有無が完了している事が前提で、置換処理の部分だけです。)