- ベストアンサー
掲示板に書き込みされる文字列の変換について
掲示板に書き込みされる文字列の変換について教えてください。 メッセージ($form{'msg'})の中にURLがあり、かつ、そのURLの中に#がある時、そのURLの中の#のみを%23に変換するという条件式は、どのように書けば良いのでしょうか? 始めたばかりなのですが、条件式を組み立てるのって難しいです。 このど素人に何卒お力をお貸しください。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
1つ目のやり方は、 1)先に、#に関係なくすべてのURLをHTMLに変換しておく。 2)「<a href=」直後に来るアドレスに含まれる#をすべて置換する。 2つ目のやり方は、普通に条件式を作ってやるやり方で、コード例を記載しておきます。(専門家ではないので、やや冗長かもしれませんが・・・) my $char = '-_\.!~*\'()a-zA-Z0-9;/?:@&=+$,%#'; $form{'msg'} =~ s|(https?:\/\/[$char]+)|&change($1)|sge; sub change{ my ($line) = @_; if($line =~ m|(https?:\/\/[$char]+)\#([$char]+)|){ $line = "<a href=\"$1#$2\">$1%23$2</a>"; }else{ $line = "<a href=\"$line\">$line</a>"; } return $line; }
その他の回答 (2)
- rafysta
- ベストアンサー率45% (24/53)
my $char = '-_\.!~*\'()a-zA-Z0-9;/?:@&=+$,%'; $form{'msg'} =~ s|((https?:\/\/[$char]+)\#([$char]+))|<a href="$2\%23$3">$1<\/a>|sg;
補足
度々の回答ありがとうございます。 ですが、これだと元々のスクリプトでハイパーリンクにしているアンカーとダブってしまいました。 それで、元々のスクリプトの方のアンカーを作っている箇所をコメントしてみました。 すると、URLの中に#が無い場合は、ハイパーリンクになってくれません。 自分なりにいろいろ考えてみたんですけど、#が無い場合のURLをハイパーリンクにする事が出来ませんでした。 #が無い場合のみのURLにマッチさせる方法が難しいです。どうしても、#付きのURLとダブってしまいます。 すみませんが、引き続き、アドバイスいただけると幸いです。
- rafysta
- ベストアンサー率45% (24/53)
条件式を作って順番に処理するやり方は、良い方法が思いつかなかったのですが、正規表現だと簡単です。 URLに使える文字列ついては、「"http(s)://" 以降に記述できる文字は、英数字(大文字・小文字)と記号類(- _ . ! ~ * ' ( ) ; / ? : @ & = + $ , % #)であることがわかる。」(参考URL) であるそうなので、これらの文字で構成された文字列を見つけてきて、そこに含まれる#を正規表現で置換します。 my $char = '-_\.!~*\'()a-zA-Z0-9;/?:@&=+$,%'; $form{'msg'} =~ s|(https?:\/\/[$char]+)\#([$char]+)|$1\%23$2|sg;
補足
回答ありがとうございます。 こういうのは、正規表現でやるんですね。 おかげさまで、思ったとおりの動作になりました。 なのですが、元の変換前の値も利用したいと考えています。 1さんが提示してくださった、参考URLの 「"http://~" ではじまる文字列を自動的にハイパーリンクに変換」 というのが、まさにいじっているスクリプトと同じでして、 <a href="%23に変換後のURL">変換前のURL</a> と言うようにしたいと思っています。 元の値も利用する方法はありますでしょうか?
お礼
再三に渡る質問への回答、ありがとうございます。 1つ目の方法は、No.2の回答をいただいたときに、いろいろ模索したのですが、私の頭では考え出せませんでした。 今回も、少し粘ってみたんですが、どうにも難しいです。 素直に、2つ目の方法を使わせていただきたいと思います。 今回は本当にお世話になりました。とても感謝しています。