人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

perlの正規表現による条件分岐と文字列置換がどうもうまくいきません。
やりたい処理:
任意の文章データに含まれるURLに自動リンクを貼り、そのURLが画像ならば画像を表示し、youtubeならば再生画面を表示させるというものなのですが、正規表現での条件分岐が分からず苦戦しています。

元データ例:
はてな公式サイトhttp://q.hatena.ne.jp/をみてね
http://www.youtube.com/watch?v=LIhbap3FlGc
http://i.yimg.jp/images/mht/2006/1218_xmas.gif

$data =~ s/(http\:[\w\.\~\-\/\?\&\+\=\:\%]+)/<A href=\"$&\" target=\"_blank\">$&<\/A>/g; =~ s/http\:\/\/(?:www\.)?youtube\.com\/watch\?v\=([a-zA-Z0-9\_]{1,})/<object width\=\"425\" height\=\"350\"><param name\=\"movie\" value\=\"http\:\/\/www\.youtube\.com\/v\/$1\"><\/param><param name\=\"wmode\" value\=\"transparent\"><\/param><embed src=\"http\:\/\/www\.youtube\.com\/v\/$1\" type\=\"application\/x-shockwave-flash\" wmode\=\"transparent\" width\=\"425\" height\=\"350\"><\/embed><\/object>/g;
$data =~ s/(http\:[\w\.\~\-\/\?\&\+\=\:\%]+)/<A href=\"$&\" target=\"_blank\">$&<\/A>/g;

上のコードを書くと2重に処理されうまく表示できません、ご教授お願い致します。

●質問者: darkroseangel
●カテゴリ:ウェブ制作
✍キーワード:HTTP Perl URL WWW YouTube
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● b-wind
●60ポイント
my $url_regex = q|(https?\:(?!(?:www\.)?youtube\.com/)[\w\.\~\-\/\?\&amp;\+\=\:\%]+)|;
my $url_replace = q|<a href="$1" target="_blank">$1<\/a>|;
my $youtube_regex = q|http://(?:www\.)?youtube\.com/watch\?v\=([a-zA-Z0-9\_]{1,})|;
my $youtube_replace = join '', split "\n" , <<'__HTML__';
<object width="425" height="350">
<param name="movie" value="http://www.youtube.com/v/$1"></param>
<param name="wmode" value="transparent"></param>
<embed src="http://www.youtube.com/v/$1" type="application/x-shockwave-flash"
 wmode="transparent" width="425" height="350"></embed>
</object>
__HTML__

eval "\$data =~ s|$url_regex|$url_replace|g;";
eval "\$data =~ s|$youtube_regex|$youtube_replace|g;";

こんな感じで。

◎質問者からの返答

回答ありがとうございます。

上記を参考に最終的には関数化してみました。正規表現難しい・・・

画像も表示させようかと思いましたが、今回は見送りにしました。

sub urlstr{
my $str = shift;
my $url_regex = q|(http\:\/\/(?!(?:www\.)?youtube\.com/)[\w\.\~\-\/\?\&amp;\+\=\:\%]+)|;
my $url_replace = q|<a href=\"$1\" target=\"_blank\">$1<\/a>|;

my $youtube_regex = q|http://(?:www\.)?youtube\.com/watch\?v\=([a-zA-Z0-9\_\-\&amp;\=]{1,})|;
my $youtube_replace = join '', split "\n" , <<'__HTML__';
<object width="425" height="350">
<param name="movie" value="http://www.youtube.com/v/$1"></param>
<param name="wmode" value="transparent"></param>
<embed src="http://www.youtube.com/v/$1" type="application/x-shockwave-flash"
 wmode="transparent" width="425" height="350"></embed>
</object>
__HTML__

eval "\$str =~ s|$url_regex|$url_replace|g;";
eval "\$str =~ s|$youtube_regex|$youtube_replace|g;";

return($str);
}

$data = urlstr($data);
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ