質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

5回答

5704閲覧

PHPを使ってある変数$textのハッシュタグの内容をリンクに置き換えたいと思っています。

gomengo

総合スコア51

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

2クリップ

投稿2014/12/12 05:01

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

"あああああ #ああ#あい#あう#あえ#あお#あか #ああい #か"

この変数$textのハッシュタグの内容には日本語や英語だけでなく、その他の言語の文字(ハングルやアラビア文字など)でハッシュタグがある場合があります。またハッシュタグは。"#ああ#あい"の様にくっついていても
"#ああ #あい"の2つのハッシュタグとして判別し、"<a href="http://aa.jp/ああ">#ああ</a><a href="http://aa.jp/あい">#あい</a>"と変換したいです。

現状、変数$tagsに配列でハッシュタグの情報が入っているので以下のようにしていますが、#ああい のハッシュタグを#ああ のハッシュタグで二重に書き換えてしまったりしています。

<?php for ($i = 0 ; $i < count($tags); $i++){ $text = str_ireplace('#'.$tags[$i], '<a href="http://aaa.com/'.$tags[$i].'">#'.$tags[$i].'</a>', $text ); } ?>

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

Twitter側が意図した通りの正確な置換を行うには、コメントで述べた通りオフセットに基づいた置換が必要です。以下に実装例があるので参考にしてください。

TwitterText
https://github.com/mpyw/TwitterText

TwitterAPIのエンティティを正確に反映したり画像サムネイルを簡単にセット出来るライブラリを作ってみた
http://qiita.com/mpyw/items/7516c4b826dfb27811ed

MyTwitterTextクラスとして継承した上で

lang

1echo MyLinkifier::factory($status->text)->linkify( 2 $status->entities, 3 isset($status->extended_entities) ? $status->extended_entities ? null 4);

これで完璧な結果が得られます。

投稿2014/12/12 09:44

mpyw

総合スコア5223

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

こういうこと?

lang

1<?php 2/* 3 * - # から始まる連続した非空白文字を置換 4 * - # は先頭のみ 5 */ 6 7$text = "あああああ #ああ#あい#あう#あえ#あお#あか #ああい #か"; 8 9$html = preg_replace_callback('/#([^#\s]*)/u', function ($m) { 10 list (, $h) = $m; 11 return sprintf('<a href="http://aa.jp/%s">%s</a>', 12 htmlspecialchars($h), 13 htmlspecialchars($h) 14 ); 15}, $text); 16 17echo $html;

# と空白文字以外のすべての文字をそのまま置換しているので多少の改善が必要かもしれませんが。

投稿2014/12/12 03:33

ngyuki

総合スコア4514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gomengo

2014/12/12 04:59

細かいところは見ていないのですが、このやり方でほぼ大丈夫だと思います。 ありがとう御座います。 どうしたらいいか全く分からなかったので、まだまだ、勉強が必要だと感じました。 ベストアンサーにさせていただきます。
mpyw

2014/12/12 07:04

実際はハッシュタグになる条件はもっと複雑なので、TwitterAPI側が「entities」としてハッシュタグになる部分のオフセットと文字数を提供してくれています。通常はそちらを利用します。
mpyw

2014/12/12 07:09

メンションなんかも同じですね。具体的には「メンション」「ハッシュタグ」「URL」「メディア」、この4つの情報をまず1つの配列にまとめて、開始オフセットの若い順にソートした後、先頭から置換を始め、置換前と置換後の長さの差分を足しながら最後まで置換を行います。
guest

0

ngyukiさんの回答をベースにしたものですが
・元テキストの先頭に「#」がなくても1つ目として処理
・空白があった場合に置換後の文字列に空白が残らないように
という改良バージョンとして以下どうでしょうか。

lang

1$html = preg_replace_callback('/(\A|#)([^#\s]*)\s*/u', function ($m) { 2 list (, , $h) = $m; 3 return sprintf('<a href="http://aa.jp/%s">#%s</a>', 4 htmlspecialchars($h), 5 htmlspecialchars($h) 6 ); 7}, $text);

余談ですが

lang

1 list (, $h) = $m;

こんな記述方法できるんですね。

投稿2014/12/12 04:04

nureha

総合スコア49

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gomengo

2014/12/12 04:57

このやり方で大丈夫そうです。 ありがとうございます。 ngyukiさんの方が先に基本的な方法を教えて頂けたのでそちらをベストアンサーにします。もうしわけないです。 list (, , $h) = $m; という記述は僕も知りませんでした。
guest

0

ちょっと強引ですが・・・

lang

1$ary = explode("#", "あああああ #ああ#あい#あう#あえ#あお#あか #ああい #か"); 2$text = array_shift($ary); 3 4foreach($ary as $tag) { 5}

という形にしてforeach内で処理してみる、というのはいかがでしょうか?

投稿2014/12/12 03:22

yosida001

総合スコア56

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gomengo

2014/12/12 04:45

コメントありがとう御座います。 他の方の回答で解決しました。
guest

0

インターネット検索してみた感じだとライブラリやコード片でいくつか見つかりますが、基本的に正規表現で処理しているようなので、対応する文字を厳密に指定してあげる必要がありそうです。
多重に置換してしまう問題は、正規表現による置換であれば回避できるのではないかと思います。

投稿2014/12/12 02:19

TaMaMhyu

総合スコア1356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gomengo

2014/12/12 04:43

ありがとう御座います。 他の方の回答で回答しました。正規表現でもやったのですが、日本語と英語以外の文字をどう変換するかが分からなかったので。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問