![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
perlで書かれた掲示板への書き込みの際、メッセージの中のURLに#がある場合、その中の#を%23にするのに次のようになっています。
my $char = '-_\.!~*\'()a-zA-Z0-9;/?:@&=+$,%#';
$MsgTrans =~ s|(https?:\/\/[$char]+)|&change($1)|sge;
sub change{
my ($line) = @_;
if($line =~ m|(https?:\/\/[$char]+)\#([$char]+)|){
$line = "<a href=\"$RS$1%23$2\">$1#$2</a>";
}else{
$line = "<a href=\"$RS$line\">$line</a>";
}
return $line;
}
これを踏襲しつつ、特定のURLの場合、$RSがつかないようにするにはどう書けばよいですか。
No.3
- 回答日時:
まず, change の中の
$line = "<a href=\"$RS$1%23$2\">$1#$2</a>";
についてよく見てみると $1#$2 は $line と同じだから実は
$line = "<a href=\"$RS$1%23$2\">$line</a>";
と直すことができる. で, Perl 5.14 以降では s/// に /r フラグがあって
my $newuri = $line =~ s|(https?:\/\/[$char]+)\#([$char]+)|$1%23$2|r;
とすると, さらに
$line = "<a href=\"$RS$line\">$line</a>";
もまとめて
$line = "<a href=\"$RS$newuri\">$line</a>";
とすることができる. ここで $line にあるすべての # を置き換えるには s/#/%23/g でできることから, 現在のコードは
sub change{
my ($line) = @_;
my $newuri = $line =~ s/#/%23/gr;
$line = "<a href=\"$RS$newuri\">$line</a>";
return $line;
}
と書き直すことができる.
あとは「特定のURLの場合、$RSがつかないようにする」だが, これを含めると
sub change{
my ($line) = @_;
my $newuri = $line =~ s/#/%23/gr;
if (特定の URL) {
$line = "<a href=\"$newuri\">$line</a>";
} else {
$line = "<a href=\"$RS$newuri\">$line</a>";
}
return $line;
}
という感じになる. あとは「特定の URL」の判定だが, そこは知らん. 単純には
if ($line =~ m|なんか|)
という判定でいけるかもしれん. あと「特定のURLをいくつか指定できるように」ということだと
その「特定の URL の指定」はどうするの?
ってとこから話がはじまる. 配列にいれるなら配列にいれるで「どのようになっているのか」がほしいねぇ.
ついでだが, 例えば
$MsgTrans =~ s|(https?:\/\/[$char]+)|&change($1)|sge;
はなんで / をエスケープしてるの?
大変ありがとうございました。
当初思っていた通りの動作に出来ました。
if ($line =~ m|なんか|)
の「なんか」の部分に直接http://hogehoge/と記述したのですが動いてくれました。
「特定のURLをいくつか指定できるように」は思ったよりも大変そうなので今回は見送る事にします。
その代わりと言っては何ですが、「特定の URL」の場合は#を%23に変換しないようにしたいことに気づいてしまいました。
%23は別CGIに渡すための変換だったのですが、「特定の URL」の場合は直接リンク先に飛ぶため#の恩恵にあずかれなくなってしまうのです。
そこで、せっかく綺麗にまとめてくださったのに汚してしまって申し訳ないのですが、
sub change{
my ($line) = @_;
if ($line =~ m|http://hogehoge/|) {
my $newuri = $line;
$line = "<a href=\"$newuri\">$line</a>";
} else {
my $newuri = $line =~ s/#/%23/gr;
$line = "<a href=\"$RS$newuri\">$line</a>";
}
return $line;
}
以上のようにしてみました(一応希望通りには動きます)。
これで良いのかどうかも解っていません。
もっとやりようがあれば教えていただけると幸いです。
よろしくお願いいたします。
$MsgTrans =~ s|(https?:\/\/[$char]+)|&change($1)|sge;
のエスケープは何かのコピペだったかも知れません。
無くても正常に動いたので消しておきました。
No.2
- 回答日時:
あとちょっと確認することがあった.
・Perl のバージョンはいくつ?
・「特定のURLの場合」はどう判定するつもり?
サーバーのperlのバージョンは5.14.xみたいです。
特定のURLをどう判定するかという意味が判らないのですが、変数$RSは外部サイトへのリンクにアクセスする際の注意事項画面を表示する別CGIへのURLです。
yahooの外部リンクみたいな感じです。2ちゃんのime.nuみたいなものでしょうか。
掲示板を設置した自サイト内へのリンクには不要なので、同サーバー内のURLには適応しないようにしたいのです。
もし可能でしたら特定のURLをいくつか指定できるように出来れば嬉しいです。
こんな説明でご理解いただけるでしょうか?
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perl言語について。
-
テキストファイルで提出とは?
-
Perlのエラーについてご教授く...
-
INDIRECT 横に再度抽出したい
-
perl LWPでURLにアクセスした時...
-
perlのgrepでmyを付けた場合と...
-
ファイルをディレクトリ分配の...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
-
perlについて
-
perlのrequireの動き方について...
-
perlの構文でカンマの意味が分...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
openした後、closeしないでプロ...
-
テキストファイルで提出とは?
-
INDIRECT 横に再度抽出したい
-
Perlで特定文字列から特定文字...
-
perlをバージョンアップしたら...
-
Wallpaper Engineでおすすめの...
-
arduino の割り込み処理について
-
アルファベットに付いて質問し...
-
Strawberry Perl for Windows ...
-
Perlで時間の計算
-
このファイルを開く方法で困っ...
-
TeraPadエディターの操作方法に...
-
cgiでサーバーにファイルを追加...
-
フローチャート 九九
-
LinuxにおいてのPerlのプログラ...
-
perl 初等プログラミングについて
-
Perlのエラーについてご教授く...
-
こんにちは ブラケッツでプログ...
-
bashスクリプト
-
perlプログラミング 空白行削除
おすすめ情報