CGIにタグの自動閉じ機能をつけるには?

[上に] [前に] [次に]
じぇい 1999/05/23(日) 21:53:43
CGIにタグの自動閉じ機能をつけようと思っています。
基本的にはタグの使用を禁止してfontタグのみの使用を可能にしようと思っています。
1行だけメッセージを書き込む掲示板に付けようと思っているので、少々処理がややこしくなっても、それほど問題ではないと思っています。
それで現在、まず一度、

$msg =~ s/</&lt;/g;
$msg =~ s/>/&gt;/g;

というふうにして、一度すべてのタグを禁止してから、

$k = 0;
while($f_msg =~ /(.*)&lt;(\s*font.+?)&gt;(.*)/i){
    $f_msg = "$1<$2>$3";
    $k++;
}

while($f_msg =~ /(.*)&lt;(\s*\/\s*font\s*)&gt;(.*)/i){
    $f_msg = "$1<$2>$3";
    $k--;
}

while($k > 0){
    $f_msg .="</font>";
    $k--;
}

というふうにしてfontタグのみを許可しようと思っています。(多分効率的な問題で大いに間違っていると思います。まだ、あまり正規表現について詳しくないので、前方参照とかがよくわからなくて、なんか回りくどいことをやっていると思います。できれば、ご指摘のほうお願いします。)

しかし、一番初めの置き換えのときに、

$msg =~ s/"/&quot;/g;

という処理を行っているので、fontタグの中の &quot を \" に置きかえる作業をしようと思いました。それで、

while($f_msg =~ /(.*)&lt;(\s*\/\s*font\s*)&gt;(.*)/i){

のあとに、

$2 =~ s/&quot;/\"/g;

という処理を追加したら、サーバーエラーになりました。この処理で間違っている部分を教えてください。(多分はじめから間違いだらけだと思いますが、、、^^;)

B-Cus 1999/05/23(日) 23:46:38
> $2 =~ s/&quot;/\"/g;
> という処理を追加したら、サーバーエラーになりました。

$1や$2は書き換えできません。一度別の変数に代入してから
書き換えましょう。手元にperlをインストールしておけば、
こういうperlのミスがすぐに検出できて便利かと思います。

> &lt;(\s*font
「< font」って、タグとして有効だったっけ…?


じぇい 1999/05/23(日) 23:51:36
>「< font」って、タグとして有効だったっけ…?

無効でした^^;。さっきテストをしたところ、fontの前には空白があってはだめでした。知識がなくてすいません。^^;

>$1や$2は書き換えできません。
そうでしたか。謎が解けました。

しかし、、上記の方法でタグの自動閉じをするのはなんかすごい効率が悪いような気がするのですが、、、どうでしょう?

じぇい 1999/05/24(月) 00:29:44
一度変数に代入しなおしてから処理を行ったのですが、、またまた、おかしなことが、、、

$k = 0;
while($f_msg =~ /(.*)&lt;(font.+?)&gt;(.*)/i){
  $d2 = $2;
  $d2 =~ s/&quot;/\"/g;
  $f_msg = "$1<$d2>$3";
  $k++;
}

while($f_msg =~ /(.*)&lt;(\/font\s*)&gt;(.*)/i){
  $f_msg = "$1<$2>$3";
  $k--;
}

while($k > 0){
  $f_msg .="</font>";
  $k--;
}

たぶん、
  $f_msg = "$1<$d2>$3";
の部分が間違っていると思うのですが、、

修正する前は、

<font color="blue">テスト

と入力してソースをみると、

<font color=&quot;blue&quot;>テスト</font>

となったのですが、修正後は、

<font color="blue"></font>

となって、肝心のコメントが省かれていました。何が原因なのでしょうか?


じぇい 1999/05/24(月) 02:54:03
[[解決]]
自己フォローです。
while($f_msg =~ /(.*)&lt;(font.+?)&gt;(.*)/i){
  $d2 = $2;
  $d2 =~ s/&quot;/\"/g;
  $f_msg = "$1<$d2>$3";
  $k++;
}

これでは

$f_msg =~ /(.*)&lt;(font.+?)&gt;(.*)/i

の部分での$1と$2と$3が、

  $d2 =~ s/&quot;/\"/g;

の処理を行ったときに初期化されていたのですね…。
なぜ気づかなかったのでしょう、、。お恥ずかしい。

ちなみに、もっと効率的なほうほうがあれば教えてください。(多分余裕であると思いますが。^^;)
一応解決を押しておきます。

なえ 1999/05/24(月) 12:38:24
こんなんどうです。

$n_ftag = $msg =~ s/&lt;font(\s.*?)?&gt;/<font$1>/ig;
$n_btag = $msg =~ s!&lt;/font(\s.*?)?&gt;!</font>!ig;
if ($n_ftag - $n_btag > 0){
$msg .= '</font>' x ($n_ftag - $n_btag);
}


じぇい 1999/05/24(月) 15:28:47
あっ、、

$n_ftag = $msg =~ s/&lt;font(\s.*?)?&gt;/<font$1>/ig;

では、$n_ftagにはマッチした数が格納されるんですね。
それならばそちらのほうがずっときれいですね。

ちなみに、、

</font aaa>

これでも、閉じれるんですね、、、。なんかぜんぜん知識が無くて、、、。

どうもありがとうございました。

じぇい 1999/05/24(月) 15:35:27
すいません。。。

$n_ftag = $f_msg =~ s/&lt;font(\s.*?)?&gt;/<font$1>/ig;

の部分で、$1の中の&quot;を " に変換する作業はどうやればいいでしょうか?
あと、$1というのはそういうふうにも参照することができるんですね。
一度試してみたのですが、サーバーエラーになってしまいだめなのかと思ってました。

じぇい 1999/05/24(月) 15:44:42
$n_ftag = $msg =~ s/&lt;font(\s.*?)?&gt;/<font$1>/ig;
$msg =~ s/<(font\s.*?)?&quot;(.*?)?&quot;(.*?)?>/$1"$2"$3/ig;
$n_btag = $msg =~ s!&lt;/font(\s.*?)?&gt;!</font>!ig;
if ($n_ftag - $n_btag > 0){
$msg .= '</font>' x ($n_ftag - $n_btag);
}

これでいいんですかね、、、?
でも、、また、なんか遠回りなことしてるような気がしてきました、、、。
う〜ん、、正しくはどうすればいいのでしょう?

なえ 1999/05/24(月) 16:38:36
$n_ftag = $msg =~ s/&lt;font(\s.*?)?&gt;/'<font'.&quot($1).'>'/ige;
$n_btag = $msg =~ s!&lt;/font(\s.*?)?&gt;!</font>!ig;
if ($n_ftag - $n_btag > 0){
    $msg .= '</font>' x ($n_ftag - $n_btag);
}

sub quot{
my($buf) = $_[0];
$buf =~ s/&quot;/"/g;
$buf;
}
う、ちょっと苦しくなってきた(^_^;
もっとスマートなやり方無いかなぁ。

じぇい 1999/05/24(月) 17:02:19
ああ、、なるほど。
正規表現の中でもサブルーチンを入れることができるんですね。
とりあえずは、それを使わせてもらいます。
もっとスマートなやり方、、あるんですかね、、?

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