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重に処理されうまく表示できません、ご教授お願い致します。

回答の条件
  • 1人2回まで
  • 登録:2006/12/21 12:14:18
  • 終了:2006/12/21 14:06:04

回答(1件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402006/12/21 12:42:45

ポイント60pt
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;";

こんな感じで。

id:darkroseangel

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

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

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

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);
2006/12/21 14:04:02

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません