プロが教えるわが家の防犯対策術!

表(<table>)の直前が、改行されてしまう。

perlでコーディングしています。データベースはmdbファイルです。

<textarea>内を簡単なWebエディタに見立てて、
<textarea>内へhtmlタグなどで書き込んだデータを、
mdbのメモ型フィールに更新し、これをブラウザで表示させています。

このとき、表(<table>)を表示させるために、<textarea>内に<table><tr><td>タグを入力するのですが、mdbファイルに更新する際に、

<table>
<tr>
<td>
  :

のように、改行した状態で更新すると、書き込んだ改行分だけ、ブラウザに表示された表の直前が改行されてしまいます。
(mdbファイルに直接書き込んでも同現象となりました。)

<table<tr><td>・・・

と改行せずに書き込むと、ブラウザに表示された表の直前は改行されませんでした。


なお、ブラウザに表示させる側のcgiファイルには、改行キー(¥nなど)を改行タグ(<br>)に変換させるために、

  $textarea1 =~ s/\r\r/<br>/g;
  $textarea1 =~ s/\r/<br>/g;
  $textarea1 =~ s/\n/<br>/g;

としているため、これと関係していると思われるのですが、
わたくしとしては、
 ●<textarea>内で手入力した改行は、ブラウザ表示に反映させるが、
 ●<tabel>・・・・</tabel>の部分は、改行して入力されていても、この改行だけは無視する、
と言った、都合のよいことをしたいのですが・・・、行き詰っております。

perlやcgiの問題ではないかも知れませんが、
どなたか、よいアドバイス、ご提案などございませんでしょうか。
ご教授いただければ、大変助かります。
よろしくお願いします。

A 回答 (3件)

HTMLは、空白文字は次のように処理します。


Paragraphs, Lines, and Phrases (ja) ( http://www.asahi-net.or.jp/%7Esd5a-ucd/rec-html4 … )
 言い換えれば改行コードの変更は不必要です。
 <p>段落</p>でマークアップすべきで、行間が広ければスタイルシートで調整するべきです。

<br>は次のような特殊な場合を除いて通常はHTML内に表れない要素です。
<address>
 東京都新宿区<br>
 なんとか町なん丁目何番地<br>
 誰それ誰べえ<br>
</address>
【引用】____________ここから
BR要素は、現在のテキスト行を強制的に区切る(終了させる)。
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ここまで[Paragraphs, Lines, and Phrases (ja)( http://www.asahi-net.or.jp/%7Esd5a-ucd/rec-html4 … )]より

><table>~</table>の範囲を、
>置き換え演算子を使って、改行(<p>$&</p>)させているのでしょうか。
 s/^.*$/<p>$&<\/p>/;
 は、s///;で置換演算子です。$&はマッチしたものすべて、^は行頭$は行末

_____________________________
 テスト結果 スクリプトは・・末尾(text2html.pl)、
perl text2html.pl;
<p>
のように、改行した状態で更新すると、書き込んだ改行分だけ、ブラ
ウザに表示された表の直前が改行されてしまいます。
</p>
<p>
(mdbファイルに直接書き込んでも同現象となりました。)
</p>

<table>
<tbody>
<tr>
<td>・・・</td>
<td>・・・</td>
</tr>
</tr>
</tbody>
</table>
<p>
と改行せずに書き込むと、ブラウザに表示された表の直前は改行され
ませんでした。
</p>


__________________以下すべて(text2html.pl)________
#!/usr/local/bin/perl

use strict;
my $tableCheck = 0;
while(<DATA>){
if( /<\/table>/ ){
$tableCheck = 0;
}
elsif( /<table[^>]*?>/ ){
$tableCheck = 1;
}
else{
if($tableCheck!=1){s/^.+$/<p>\n\t$&\n<\/p>/;}
}
print;
}
if($tableCheck==1){ print "\n\ntableが閉じられていません!!\n";}

__END__
のように、改行した状態で更新すると、書き込んだ改行分だけ、ブラウザに表示された表の直前が改行されてしまいます。
(mdbファイルに直接書き込んでも同現象となりました。)

<table>
<tbody>
<tr>
<td>・・・</td>
<td>・・・</td>
</tr>
</tr>
</tbody>
</table>
と改行せずに書き込むと、ブラウザに表示された表の直前は改行されませんでした。

この回答への補足

ご回答、重ねてありがとうございます。

やはり初心者の私のレベルでは、ちょっと難しかったので、
以下のように、やや強引に改行を排除しました。(邪道ですが)

↓==================================

for ( $i=1; $i<=50; $i++){$textarea1 =~ s/\ <table/<table/g;}
for ( $i=1; $i<=50; $i++){$textarea1 =~ s/\ <tr/<tr/g;}
for ( $i=1; $i<=50; $i++){$textarea1 =~ s/\ <td/<td/g;}
for ( $i=1; $i<=50; $i++){$textarea1 =~ s/\ <\/td>/<\/td>/g;}
for ( $i=1; $i<=50; $i++){$textarea1 =~ s/\ <\/tr>/<\/tr>/g;}
for ( $i=1; $i<=50; $i++){$textarea1 =~ s/\ <\/table>/<\/table>/g;}

$textarea1 =~ s/(\r\n\n|\r\n|\n|\r)<tr/<tr/g;
$textarea1 =~ s/(\r\n\n|\r\n|\n|\r)<td/<td/g;
$textarea1 =~ s/(\r\n\n|\r\n|\n|\r)<\/td>/<\/td>/g;
$textarea1 =~ s/(\r\n\n|\r\n|\n|\r)<\/tr>/<\/tr>/g;
$textarea1 =~ s/(\r\n\n|\r\n|\n|\r)<\/table>/<\/table>/g;

↑==================================

今後、もっと勉強いたします。
ありがとうございました。

補足日時:2010/06/04 11:50
    • good
    • 0

<textarea>タグ内に<table>タグを記述しようなんて、初めて聞きました。


普通は逆なんじゃないですか。www
    • good
    • 0
この回答へのお礼

ご回答ありがとう。

えーっと・・・、
言わずもがな。
そんなことは承知の上。
普通のことだったら聞かないから。
必要性があって、やってるのね。
でわ。

お礼日時:2010/06/26 22:00

>perlやcgiの問題ではないかも知れませんが、


ともいえるし、HTMLの仕様でもあるし、ブラウザの仕様ともいえます。
HTMLは、厳密に要素内に入りうる要素は決められています。たとえばTABLEには
【引用】____________ここから
<!ELEMENT TABLE - - (CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+)>
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ここまで[Tables in HTML documents (ja)( http://www.asahi-net.or.jp/%7Esd5a-ucd/rec-html4 … )]より

CAPTION? ゼロもしくは一個
(COL*|COLGROUP*), ゼロもしくは任意の数
THEAD?, ゼロもしくは一個
TFOOT?, ゼロもしくは一個
TBODY+ 一個以上

 と・・・書かれている。<br>は入らない。

 この場合、ブラウザは<br>--inline---要素はTABLE内の外・・に置かれる。よって
<table><br><tbody><br><tr><br><td>・・</td><br></tr><br></tbody><br></table>は、ブラウザによって、
<br><br><br><br><br><br>
<table><tbody><tr><td>・・</td></tr></tbody></table>
と解釈されなければならない。<br>が他のinlne要素や非空白文字でもでも同じ結果になる。
 また、tableはブロック要素なので、inline要素に続く場合は、そこでブロック要素が終了するとみなさなければならないため

7.5.3 ブロックレベル要素と行内要素 ( http://www.asahi-net.or.jp/%7Esd5a-ucd/rec-html4 … )

なんたらかんたら<br>
なんたらかんたら<br>
<table>
 というのはおかしい。
<p>なんたらかんたら</p>
<p>なんたらかんたら</p>
<table>
 ・・です。<br>は段落内の強制改行なので通常のHTML内には殆ど出現しない。
while(<IN>){
if( /<\/table>/ ){$tableCheck = 1;}
elsif( /<table[^>]*?>/ ){$tableCheck = 1;}
if($tableCheck!=1){/^.*$/<p>$&</p>/g;}
}
とか・・・かな。

出力されるHTMLをみて、仕様書と照合しましょう。

この回答への補足

ご回答ありがとうございます。

>HTMLは、厳密に要素内に入りうる要素は決められています。
ここまで、詳しいこと(基本的なこと)まで知りませんでした。
お恥ずかしい限りです。勉強になりました。


あと、聞きづらいのですが、
小生、perl初心者でございまして、可能ならば教えていただきたいのですが。

>while(<IN>){
>if( /<\/table>/ ){$tableCheck = 1;}
>elsif( /<table[^>]*?>/ ){$tableCheck = 1;}
>if($tableCheck!=1){/^.*$/<p>$&</p>/g;}
>}

について、
<table>~</table>の範囲を、
置き換え演算子を使って、改行(<p>$&</p>)させているのでしょうか。
処理の内容が、勉強不足にて理解できていません。
ご教授願えませんでしょうか。
よろしくお願い申し上げます。

補足日時:2010/06/04 07:54
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!