正規表現道場@2ch

このエントリーをはてなブックマークに追加
104
$http_URL_regex=「URLの正規表現」(長いので割愛)

として、掲示板スクリプトの書き込みの中にあるURLに
こうやって自動リンク貼ってる。↓

$data =~ s/($http_URL_regex)/<a href="$1">$1<\/a>/go;

現状だと
http://www.test.com/dir/index.html が
<a href="http://www.test.com/dir/index.html>http://www.test.com/dir/index.html</a> に
置き換わるだけだけど、URL表示の/(スラッシュ)を「<wbr>/」に
置き換えるようにしたい。

具体的には、上の例でいうと
<a href="http://www.test.com/dir/index.html>http://www.test.com<wbr>/dir<wbr>/index.html</a>
って感じにしたい。

一行が長くてゴメソ。分かる人教えて。
105名無しさん@お腹いっぱい。:01/10/12 02:04 ID:???
>>104
分かるもなにも、その$http_URL_regexってやつを
見せてもらわんと。そんなに長いんか?
も、もしかして、大崎氏の「Perlメモ」にある
ものすごい正規表現のことかな。。。
106名無しさん@お腹いっぱい。:01/10/12 02:04 ID:???
>>104
$data =~ s/($http_URL_regex)/&convurl($1)/ge;
sub convurl {
my($url) = shift;
my($str) = qq{<a href="$url">};
$url =~ s|(?<!/)/(?!/)|<wbr>/|g;
$str .= qq{$url</a>};
}

こんなんしか思いつかんダサ
107104:01/10/12 09:48 ID:???
>>105
bingo...
http://www.din.or.jp/~ohzaki/perl.htm#httpURL
にあるやつです。

>>106
うまくいった!ありがとう!
108名無しさん@お腹いっぱい。:01/10/12 12:46 ID:???
<a href="http://www.test.com/dir/index.html>http://www.test.com<wbr>/dir<wbr>/index.html</a>
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
リンク張るならここまでだろ。2chださい。
109名無しさん@お腹いっぱい。:01/10/12 13:13 ID:???
ちょいテスト

quoteなし
<a href=http://hoge.com/hoge.html>http://hoge.com<wbr>/hoge.html</a>

quoteあり
<a href="http://hoge.com/hoge.html">http://hoge.com<wbr>/hoge.html</a>

quote閉じ忘れ
<a href="http://hoge.com/hoge.html>http://hoge.com<wbr>/hoge.html</a>
110109:01/10/12 13:15 ID:???
>>108 禿しく同意!
111 :01/10/15 01:18 ID:???
112名無しさん@お腹いっぱい。:01/10/15 01:29 ID:???
>>108,109=馬鹿
113名無しさん@お腹いっぱい。:01/10/15 06:28 ID:???
>>112
その心は「クォート閉じ忘れやクォートなしは不正なのに、
それに対応していない2chを批判するのは馬鹿」という理解でよいですか。
114名無しさん@お腹いっぱい。:01/10/15 08:08 ID:???
不正じゃなくても間違えますが何か?
<a href="http://example.com/">http://example.com/</a>
ということでお題。
&は含むけど&lt;や&gt;は含まないように
リンクを張る正規表現は?
115名無しさん@お腹いっぱい。:01/10/15 08:11 ID:???
ちなみに現行はこう。
$message =~ s/(https?|ftp|gopher|telnet|whois|news)\:([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"$1\:$2\" target=\"_blank\">$1\:$2<\/a>/ig;
116113:01/10/15 09:07 ID:???
>>114
いや、そういう意味で言ってるんだとしたら間違ってるよ。
っていいたかったの。

> &は含むけど<や>は含まないように
> リンクを張る正規表現は?
URLという意味では<が含まれてても問題(よね?)と思うので、
&lt;や&gt;をはじく必要は無いと思うけど・・・
ちょっと考えるよ。
117名無しさん@お腹いっぱい。:01/10/15 09:12 ID:???
すんません。
$116 =~ s/(問題)/$1無い/;
$116 =~ s/</&lt;/g;
$116 =~ s/>/&gt;/g;
118名無しさん@お腹いっぱい。:01/10/15 10:07 ID:???
119名無しさん@お腹いっぱい。:01/10/15 10:08 ID:???
つーか正しく伝わってないかも。
< や > が含まれてると問題あるけど、htmlソース上は
&lt; や &gt; だから含まれてしまうのを
修正したいってことなんだけど。
120113:01/10/15 10:18 ID:???
s/</&lt;/g; s/>/&gt;/g してから
リンク張ってるのがまずいんですね。
リンク張りつつ < > 除去すれば正確になるのかな。

s{
  ((?:https?|ftp|gopher|telnet|whois|news)://[-_.!~*'()a-zA-Z0-9;/?:\@&=+\$,%]+)
  | (<) | (>)
}{
  $1 ? "<a href=\"$1\">$1</a>" :
  $2 ? '&lt;' :
  $3 ? '&gt;' :
  ''
}xeg;
とかはどうですか?
121113:01/10/15 10:37 ID:???
単純に &lt;、&gt; を避けるならこんな感じっすかね?
s{(
    (?:https?|ftp|gopher|telnet|whois|news)://
    (?:[-_.!~*'()a-zA-Z0-9;/?:\@=+\$,%] | &(?![lg]t;) )+
)}
{<a href=\"$1\">$1</a>}xg;
122名無しさん@お腹いっぱい。:01/10/15 11:23 ID:???
news: の場合も // で始まるんでしたっけ?
s{(
(?:(?:https?|ftp|gopher|telnet|whois)://|news:)
(?:[-_.!~*'()a-zA-Z0-9;/?:\@=+\$,%] | &(?![lg]t;) )+
)}
{<a href=\"$1\">$1</a>}xg;
123名無しさん@お腹いっぱい。:01/10/15 11:35 ID:???
URI referenceの場合にもリンクを貼りたいから
s{(
(?:(?:https?|ftp|gopher|telnet|whois)://|news:)
(?:[-_.!~*'()a-zA-Z0-9;/?:\@=+\$,%#] | &(?![lg]t;) )+
)}
{<a href=\"$1\">$1</a>}xg;
124名無しさん@お腹いっぱい。:01/10/15 11:51 ID:???
一般的なCGIなら http と ftp 以外にリンク貼る必要も無いだろうから、
これで十分かな?
s{((?:https?|ftp)://(?:[-\w.!~*'();/?:\@=+\$,%#]|&(?![lg]t;))+)}{<a href="$1">$1</a>}g;
どっちにしても中途半端だけど。
125名無しさん@お腹いっぱい。:01/10/15 12:21 ID:???
oとtarget=_blankを付けてみる。
s{((?:https?|ftp)://(?:[-\w.!~*'();/?:\@=+\$,%#]|&(?![lg]t;))+)}{<a href="$1" target=_blank>$1</a>}go;
126名無しさん@お腹いっぱい。:01/10/15 12:57 ID:???
o修飾子はパターンに変数が入っていないときは影響なしとおもう。
ちがうの?
127名無しさん@お腹いっぱい。:01/10/15 13:01 ID:???
そうかも。
128名無しさん@お腹いっぱい。:01/10/19 22:45 ID:SauUPYVx
正規表現の火を消すな。