• ベストアンサー

http://から始まる文字列を探してhtmlの画像タグにしたいです。

こんばんわ、以前こちらで質問させて頂いたものです。 今回も「perlの正規表現を使用した自動リンク関数」についての質問です。 かなり上級レベルで全然分かりません。。もし分かる方が居られましたら少しだけでも教えて下さい。首を長くしてお待ちしております。では質問です。 文字列を関数に渡して、その中にhttp://**.xx.xxなどのリンクを発見すると<a href="http://**.xx.xx">http://**.xx.xx</a> のように返す関数を使用してます。(↓参照。この関数はこちらのサイトで教えて頂きました、感謝しております) この関数に追加機能として「マッチしたリンクの拡張子がjpgだった場合、<img>タグとして展開する」という処理を加えたいのです。画像でない場合はリンクのみ、付けます。 ◎http://**.xx.xx.jpg の場合 ↓ <a href="http://**.xx.xx.jpg"> <img src="http://**.xx.xx.jpg"> </a> ◎http://**.xx.xx.xx.html の場合 ↓ <a href="http://**.xx.xx.html"> http://**.xx.xx.html </a> 関数全部でなくても、部分的にでも教えて頂けたらそれらをくっつけて作製してみます。どうかよろしくお願いします。 今 使用している関数 sub change_link(){ $_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\=\@\;\#\:\%]+)/$1<a href=\"$2\" target='_blank'>$2<\/a>/g; }

質問者が選んだベストアンサー

  • ベストアンサー
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.3

あんまり深く考えてませんが。 sub change_link(){ $_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\=\@\;\#\:\%]+)/&change_link_sub($1,$2)/ge; } sub change_link_sub(){ my($pre,$url) = @_; my $rtn = $pre . qq|<a href="$url" target="_blank">|; if($url =~ /\.(gif|jpe?g|png)$/i) { # 一応 gif,jpeg,jpg,pngに対応、不要ならjpe?gだけに。 $rtn .= qq|<img src="$url">|; } else { $rtn .= $url; } $rtn .= '</a>'; return $rtn; }

chibamania
質問者

お礼

steel_grayさん、有難うございます! 動作致しました! jpg,gif,pngにも対応とは…もう完璧ですね! 自分はこちらを使わせて頂きます。 正規表現の中で関数が呼べるとは、目からウロコです。加えて、ソースもシンプル。素晴らしいです! これ、steel_grayさんの開発したフリーソースとして公開しても良いレベルだと勝手に思います。この関数が欲しい人は山ほど居ると思うんですよ!(自分は数日間探してみましたが、探せなかったので)。 勝手なことばかり書いてしまいましたが、本当に感謝しております。自分がホームページ開発にperlを使い続ける限り、この関数は無くてはならないものとして、使い続けると思います。 これで面白いホームページが作れそうです。大切に使わせて頂きます。では、有難うございましたーー。

その他の回答 (3)

  • bender
  • ベストアンサー率45% (108/236)
回答No.4

すでに丁寧な回答が寄せられているのですが、以下のような手続きもよいように思います。 (1)http://**.xx.xx.jpg について変換 (2)質問された方がすでに行っている変換 以上の手続きで(1)で変換されたURLは " でくくられているので、(2)では変換の対象にはならないので、(1)→(2)と実行することで、期待した効果が得られるのではないでしょうか。 例、 sub change_link(){ # (1) $_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\=\@\;\#\:\%]+\.jpg)([^\w\.\~\-\/\?\&\=\@\;\#\:\%]|$)/$1<a href=\"$2\" target='_blank'><img src=\"$2\"><\/a>$3/g; # (2) $_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\=\@\;\#\:\%]+)/$1<a href=\"$2\" target='_blank'>$2<\/a>/g; }

chibamania
質問者

お礼

benderさん、ビンゴです!完全動作致しました! この関数、他の方も使われると思います。 誠に感謝致します。 以後は是非、「自信:あり」でお答えください(笑)。 自分の頭では2日考えても分からない問題だったのですが、あっという間でしたね。最後に諦めずに(まぁ諦めた訳ですが(泣))、ここで質問して良かったと思います。 名前も知らない自分に、無償で知恵をくれたことに、今の世の中も捨てた物ではないなと思いました。本当に、本当に、有難うございました。benderさんに良いことが2,3起きますようにお祈り致します。ではまたです。

  • moon_piyo
  • ベストアンサー率60% (88/146)
回答No.2

(1) <a>~</a>をみつけたらそのまま (2) http:~をみつけたら変換 (3) それ以外はそのまま perlのバージョンが古いと .*?という正規表現はつかえないかも... sub change_link {  my($buf) = "";  while ($_[0] =~ m#(<a[\s>].*?</a>)|(http\:[\w\.\~\-\/\?\&\=\@\;\#\:\%]+)|(.)#isg) {   my($p1,$p2,$p3) = ($1,$2,$3);   if (defined($p2)) {    if ($p2 =~ /\.(jpg|jpeg)$/i) {     $buf .= qq{<a href="$p2" target='_blank'><img src="$p2"></a>};    }    else {     $buf .= qq{<a href="$p2" target='_blank'>$p2</a>};    }   }   else {    $buf .= $p1.$p3;   }  }  return $buf; }

chibamania
質問者

お礼

 my($buf) = ""; 辺りでエラーが発生してしまいました。 使用しているperlのバージョンはperl -virsion で調べてみたところ、perl5のようです。 お答え頂き、有難うございます。こちらの方がプログラムっぽくて分かりやすいですね。正規表現はややこしくて…。勉強になりました。有難うございました。

chibamania
質問者

補足

ご回答、本当に有り難うございます。感謝感激っすー。 帰宅後に、皆さんの関数を動作チェックし、報告させて頂きますネ。

回答No.1

 上級レベルという言葉に引かれて、勉強してみたら、 考え方は意外と簡単でした。 考えるのは楽しんですが、きちんと安全にあっているか が、分からん。 ・・・で、誰かに補足要求というか、しばらく空けたまま にしておいてくれたら、嬉しいです。 sub change_link(){ @a = split(/\./, $_[0]); $lst = @a[$#a]; #.で分けて、最後を抽出。 #pngで分岐  if($lst eq 'png'){ $_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\=\@\;\#\:\%]+)/$1<a href=\"$2\" target='_blank'><img src="$2"><\/a>/g;}  else{ $_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\=\@\;\#\:\%]+)/$1<a href=\"$2\" target='_blank'>$2<\/a>/g;} } # END LINK この場合、pngに偽装したperl,もしくは、phpを流しても 大丈夫ですか? 問題はないとは思うけど、実際に確認した事しか、信じら れないので、。^^; 汚染チェックや、危険タグは排除されてると思いますが。 それと、$1の意味がよく分かりません。^^; ネットで調べたら、ついているので、原文そのままで。 あ、もちろん今のままだとpngだけなので、jpeg,jpg,gif は自分で付け加えてください。

chibamania
質問者

補足

ご回答ありがとうございます! 上級レベルという言葉に引かれるなんて素晴らしい向上心だと思います(笑)。他の方の質問にも様々なジャンルでお答えされているようですね(すみません、興味が沸きまして)。自分も他の方にレス出来るように目を光らせたいと思います。…全部自信無しですが(笑)。 ご回答の件ですが、ご説明が足りませんでした。 change_link()関数に渡される引数は自由なSTRINGで、確実にリンク文字があるとは限らず、その数も分からないのです。 例えば以下のようなデータです。 適当適当適当適当適当適当適当 適当適当適当適当適当適当適当 http://***.***.html 適当適当適当適当適当適当適当 http://***.***.jpg 適当適当適当適当適当適当適当 というわけでカンマで区切る方法では駄目なのです。ごめんなさい。 png偽装?というのはよく分かりませんがセキュリティ対策ですよね。ローカル環境(localhost)で使おうと思っているものなのできっと大丈夫(サーバーに迷惑かけず)だと思います。

関連するQ&A