水曜以外もどうでしょう

北海道発。食べ歩きの記録グルメ情報や北海道の見どころなどをメモ替わりに書いています。

PREV | PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
応援宜しくお願いします。ポチ↓↓
fC2ブログランキング にほんブログ村 グルメブログ 北海道食べ歩きへ 人気ブログランキングへ


| スポンサー広告 | --:-- | comments(-)| trackbacks(-)| TOP↑

≫ EDIT

phpで自動的にリンクを生成する

文章の中に、http:// で始まるようなURL(URI)が存在する場合、それを自動的に<a></a>タグで囲ってリンクに変えたい。

情報をさがしてみると、発見。

こまちドーナツ - URLの自動リンクをする正規表現(PHP)
http://www.comachi.com/2005/12/urlphp.html


正規表現はこんな感じだ。

$target = ereg_replace("(https?|ftp)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)", "<a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>" , $target);



情報ありがとうございます。
素晴らしい機能だと思います。

これはこれで良い。

しかし、次のステップで、
URLを直接記述されている場合と、<a>でのリンクが混在されている場合にうまく処理できないか?
という欲求がでてきた。

リンクされていたPHP-usersの様に。
http://ml.php.gr.jp/pipermail/php-users/2004-February/020834.html

このスレッドでは回答が途中で終わっていたが、内容は参考になり、

タグを使っている場合は https?|ftp の直前に普通「'|"」があるでしょうから,単に [^'\"] を追加して



とのことで、
「リンクではなく直接URLを書いている場合」と「リンクとしている場合」を区別出来れば良いわけで、https?|ftpの直前の1文字を見ることにする。
'か"か>の場合はリンクとみなして除外されるよう記述を追加。
さらに、変換後の文字列にその直前1文字も付加。

$target = ereg_replace("([^'\">])(https?|ftp)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)", "\\1<a href=\"\\2\\3\" target=\"_blank\">\\2\\3</a>" , $target);




下記のようなにリンク文字自体もURLになっている場合を想定して、>も追加した。
リンク <a href="http://www.google.co.jp">http://www.google.co.jp</a>


完璧ではない場合もあるかもしれないが、概ね良好。



※2015.11.19 コメントをいただいて追記。

http://が行頭の場合に動作しない問題をご指摘いただき、下記のように修正。
先頭に ^| を追加するのだ。

$target = ereg_replace("(^|[^'\">])(https?|ftp)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)", "\\1<a href=\"\\2\\3\" target=\"_blank\">\\2\\3</a>" , $target);



ご指摘ありがとうございました。
さらに、php 5.3から ereg_replaceは非推奨ですから、preg_replaceの方が良いですね。
スポンサーサイト
応援宜しくお願いします。ポチ↓↓
fC2ブログランキング にほんブログ村 グルメブログ 北海道食べ歩きへ 人気ブログランキングへ


| php | 16:26 | comments:2| trackbacks:0| TOP↑

COMMENT

初めまして、参考にして URL 自動リンクを利用させて頂きました。ありがとうございます。
1点、文字列が http から始まる場合には、リンクされないようでした。
私は preg_replace に書き換えたのですが、([^'\">]) を (^|[^'\">]) とすると動くようでした。ご参考まで。

| takotakot | 2015/11/19 22:41 | URL |

Re: タイトルなし

takotakotさま
コメントありがとうございます。
おっしゃる通りでhttpが行頭の場合には動作しないですね。気が付きませんでした。
ご提案の正規表現を本文に追記しました。
現状ではpreg_replaceの方が良いですね。
ありがとうございました。

| 水曜以外も管理者 | 2015/11/19 23:12 | URL |















非公開コメント

TRACKBACK URL

http://vmemo.blog36.fc2.com/tb.php/406-8f04a9d7

TRACKBACK

PREV | PAGE-SELECT | NEXT

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。