文字列中からすべてのURLだけを抜き出して変換するには

[上に] [前に] [次に]
あき 1999/10/29(金) 18:03:56
$save_comment =~ s/(http:\/\/[\w\$\#\~\.\/\-\?\=\&\:\%]+)/<a href\=\"$1\" target\=\"\_blank\">$1<\/a>/g;
のような形で$save_comment中のURL記述部分をリンクに変換して、
さらに、そのリンクの部分だけを配列に入れるにはどうすれば良いのでしょうか。

例えば$save_commentの中が

   こんにちはhttp://www.so-net.ne.jp/aaa/bbb/
     さようなら
   http://www.so-net.ne.jp/ccc/ddd/
    元気です

となっているときに@urlに
$url[0]にはhttp://www.so-net.ne.jp/aaa/bbb/
$url[1]にはhttp://www.so-net.ne.jp/ccc/ddd/
がセットされるようにしたいのです。

よろしくお願いいたします。

きたむら 1999/10/29(金) 21:49:52
$save_comment =~ s/(http:〜略〜)/<a href〜略〜>/g;

という部分を、

$save_comment =~ s/(http:〜略〜)/&hoge($1)/ge;

とかに変え、マッチしたURLごとにhoge関数を実行させて、
hoge関数では、

sub hoge {
local($u) = @_;
push @url, $u;
return qq(<a href="$u" target="_blank">$u</a>);
}

という具合に、配列代入とタグ生成を両方やらせるように
すればいいのではないかと思います。
(動作確認してないので間違ってたらすいません)

Aurai [E-Mail] 1999/10/29(金) 23:10:16
$save_comment =~ s/(http:\/\/[\w\$\#\~\.\/\-\?\=\&\:\%]+)/<a href\=\"$1\" target\=\"\_blank\">$1<\/a>/g;
@url = //g;
でいいんじゃないですか

Aurai [E-Mail] 1999/10/30(土) 00:42:43
アホなこと書いてました
>@url = //g;
@url = $save_comment =~ //g;
です

Aurai [E-Mail] 1999/10/30(土) 01:30:02
上の二つは無視してください(__;)
>$save_comment =~ s/(http:\/\/[\w\$\#\~\.\/\-\?\=\&\:\%]+)/<a href\=\"$1\" target\=\"\_blank\">$1<\/a>/g;
の代わりに
@url = $save_comment =~ /(http:\/\/[\w\$\#\~\.\/\-\?\=\&\:\%]+)/g;
$save_comment =~ s//<a href\=\"$1\" target\=\"\_blank\">$1<\/a>/g;
とすればいいと思います

B-Cus 1999/10/30(土) 03:34:58
 $var =~ m/(...)/g;
 $var =~ s//...$1.../g;
という書き方は初めて知ったのですが、これってどこかに明文化されて
いる機能なんでしょうか。例えばラクダ本とかに書いてありますか?

あき 1999/10/30(土) 04:18:31
テストしている間にB−Cusさんに書き込みしていただいたのですね。

とりあえずAuraiさんに教えていただいた方を試していたところでした。
この方法だと@urlにはhttp:で始まる部分が配列として格納され、
$save_commentの中のhttp:で始まる部分が
リンクとしてクリックで飛べるようになるのですよね。

$save_commentはそのままにして、
@urlの中をそれぞれクリックで飛べるようにしたかったので
@url = $save_comment =~ /(http:\/\/[\w\$\#\~\.\/\-\?\=\&\:\%]+)/g;
をやった後に配列の要素数を調べ、その要素の数分配列ごとに
~ s//<a href\=\"$1\" target\=\"\_blank\">$1<\/a>/g;
で変換するようにしたらできたようです。

まぎらわしい質問のしかたをして申し訳ありません。

私にはB−Cusさんの質問にお答えできる知識がないので、
解決マークはまだつけないでおきますね。

また、私がやった方法がとんでもない間違いをしていたり、
もっと良い方法があれば御教授ください。

皆さんありがとうございました。

B-Cus 1999/10/30(土) 04:44:02
> 配列の要素数を調べ、
別に要素数を調べてもいいんですが、
 @url = $save_comment =~ /(http:\/\/[\w\$\#\~\.\/\-\?\=\&\:\%]+)/g ;
 @url = grep { $_ = qq(<a href="$_" target="_blank">$_<\/a>) } @url;
と、grep を使えば全要素を変換できます。grep じゃなくて map を
使ってもいいです。

Aurai [E-Mail] 1999/10/30(土) 07:56:27
> $var =~ m/(...)/g;
> $var =~ s//...$1.../g;
>という書き方は初めて知ったのですが、これってどこかに明文化されて
>いる機能なんでしょうか。例えばラクダ本とかに書いてありますか?
PATTERRNが空なら前回の検索/置換のパターンを使うってやつです

B-Cus 1999/10/30(土) 08:00:55
[[解決]]
あ、ほんと。m// のところに書いてありました。
うーん、これは便利。ありがとうございました。

僕が付けるのは何か違うような気がするけど、解決。

[上に] [前に] [次に]