文中にURLがあれば、それをリンク化したい - PHPプロ!Q&A掲示板

688

  • 0P

文中にURLがあれば、それをリンク化したい

質問日時 / 2007年10月11日 15:07    回答数 / 3件

Questioner:  shepherd  このエントリーをはてなブックマークに追加 

キーワード / URL    リンク化   

プログラム初心者です。
御質問させていただきます。

掲示板を作ってます。
ある件名に対するコメントがあったとします。
そのコメントの中にURLが含まれていて、
それをリンク化したいのですが、どうすれば良いのかわかりません。
正規表現でチェックをして、URLかどうか判断するところまでは
何とかわかったのですが、それ以降のURLだったらリンク化するという処理がわかりません。

どなたかご教授願えないでしょうか?

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01tatsuki000phpの公式マニュアルに例が載っていますので、分かり
┗A02weekendphppregの方が早いみたいなので、 eregではなく、pregを
 ┗A02-1shepherdpregで試してみました。 なるほど、こちらの方が早

回答一覧

並び替え:

A01 満足
answerertatsuki000 [10月11日 16:39] (最終編集:10月11日 16:42)

phpの公式マニュアルに例が載っていますので、分かりやすくしてコピペします。

  1. <?php
  2. $text1 = "文字列中にURLらしき文字列を入れます。\n";
  3. $text1.= "http://www.phppro.jp/qa/688/";
  4.  
  5. $text2 = mb_ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]""<a href=\"\\0\">\\0</a>"$text1);
  6.  
  7. $text3 = mb_ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]""\\0)"$text1);
  8.  
  9. echo nl2br($text1);
  10. /* 結果
  11. 文字列中にURLらしき文字列を入れます。<br />
  12. http://www.phppro.jp/qa/688/
  13. */
  14.  
  15. echo nl2br($text2);
  16. /* 結果
  17. 文字列中にURLらしき文字列を入れます。<br />
  18. <a href="http://www.phppro.jp/qa/688/">http://www.phppro.jp/qa/688/</a>
  19. */
  20.  
  21. echo nl2br($text3);
  22. /* 結果
  23. 文字列中にURLらしき文字列を入れます。<br />
  24. http://www.phppro.jp/qa/688/
  25. */
  26. ?>

>正規表現でチェックをして、URLかどうか判断するところまでは何とかわかった
とあるので、関数についての説明は省きます。

注目すべきはmb_ereg_replace関数の2番目の引数"<a href=\"\\0\">\\0</a>"内にある"\\0"です
"\\0"の意味は、1番目の引数にマッチした部分と言う意味です。
つまり、"\\0"は$text1に含まれる"http://www.phppro.jp/qa/688/"となります。

少し分かり辛いのでもっと簡単なコードを書くと

  1. <?php
  2. $text1 = "123";
  3. echo $text1;
  4. /* 結果
  5. 123
  6. */
  7.  
  8. $text2 = mb_ereg_replace("123""\\0"$text1);
  9. echo $text2;
  10. /* 結果
  11. 123
  12. */
  13. ?>

多分これでなんとなく分かると思います。

説明下手で申し訳ない^^;

この意見に回答する

ツリーへ TOPへ

A02 満足
answererweekendphp [10月11日 17:36] (最終編集:10月11日 18:02)

pregの方が早いみたいなので、
eregではなく、pregを使う方法を。

やっていることは、tatsuki000さんのものと、ほぼ同じです。

  1. <?php
  2. $text1 = "文字列中にURLらしき文字列を入れます。
  3. http://www.phppro.jp/qa/688/
  4. 文章の途中でURLがhttp://www.phppro.jp/qa/688/出てきても大丈夫?
  5. そのほか、http://www.example.com/?id=0001とか、
  6. こんなんhttp://www.google.co.jp/search?q=%E6%A4%9C%E7%B4%A2%E7%B5%90%E6%9E%9C&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-aでも
  7. 大丈夫です。";
  8.  
  9. echo autoLinker($text1);
  10.  
  11.  
  12.     // $str にURLが含まれていたらリンク
  13.     function autoLinker($str)
  14.     {
  15.         $pat_sub = preg_quote('-._~%:/?#[]@!$&\'()*+,;=''/')// 正規表現向けのエスケープ処理
  16.         $pat  = '/((http|https):\/\/[0-9a-z' . $pat_sub . ']+)/i'// 正規表現パターン
  17.         $rep  = '<a href="\\1">\\1</a>'// \\1が正規表現にマッチした文字列に置き換わります
  18.  
  19.         $str = preg_replace ($pat$rep$str)// 実処理
  20.         return $str;
  21.     }

ただ、掲示板などで利用する場合は、

上記コードの実行結果は、下記の通りです。

文字列中にURLらしき文字列を入れます。
<a href="http://www.phppro.jp/qa/688/">http://www.phppro.jp/qa/688/</a>
文章の途中でURLが<a href="http://www.phppro.jp/qa/688/">http://www.phppro.jp/qa/688/</a>出てきても大丈夫?
そのほか、<a href="http://www.example.com/?id=0001">http://www.example.com/?id=0001</a>とか、
こんなん<a href="http://www.google.co.jp/search?q=%E6%A4%9C%E7%B4%A2%E7%B5%90%E6%9E%9C&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a">http://www.google.co.jp/search?q=%E6%A4%9C%E7%B4%A2%E7%B5%90%E6%9E%9C&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a</a>でも
大丈夫です。

この意見に回答する

ツリーへ TOPへ

A02-1
replyershepherd [10月12日 15:24]

pregで試してみました。

なるほど、こちらの方が早いようですね。
うまくいきました!

eregで行うやり方もpregで行うやり方も
学べてよかったです!

本当に有難うございました!

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)