- ベストアンサー
表の直前が改行されてしまう問題について
- perlでコーディングしています。データベースはmdbファイルです。テキストエリア内にhtmlタグでデータを書き込み、mdbのメモ型フィールドを更新しています。しかし、<table>タグを改行して書き込むと、ブラウザに表示された表の直前が改行されてしまいます。改行キーと改行タグの変換が関係している可能性がありますが、解決策が分かりません。
- 現在、perlとcgiを使用しているWebエディタ内で、テキストエリアに書き込まれたデータをmdbファイルのメモ型フィールドに更新し、ブラウザで表示しています。しかし、<table>タグを改行して書き込むと、ブラウザに表示された表の直前が改行されてしまいます。改行キーと改行タグの変換が関係している可能性がありますが、解決策が見つかりません。
- perlでコーディングしているWebエディタで、テキストエリア内にhtmlタグを使用してデータを書き込み、mdbファイルのメモ型フィールドを更新しています。しかし、表を表示するために<table>タグを改行して書き込むと、ブラウザに表示された表の直前が改行されてしまいます。改行キーと改行タグの変換が関係している可能性がありますが、対策が分かりません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
HTMLは、空白文字は次のように処理します。 Paragraphs, Lines, and Phrases (ja) ( http://www.asahi-net.or.jp/%7Esd5a-ucd/rec-html401j/struct/text.html#h-9.1 ) 言い換えれば改行コードの変更は不必要です。 <p>段落</p>でマークアップすべきで、行間が広ければスタイルシートで調整するべきです。 <br>は次のような特殊な場合を除いて通常はHTML内に表れない要素です。 <address> 東京都新宿区<br> なんとか町なん丁目何番地<br> 誰それ誰べえ<br> </address> 【引用】____________ここから BR要素は、現在のテキスト行を強制的に区切る(終了させる)。  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ここまで[Paragraphs, Lines, and Phrases (ja)( http://www.asahi-net.or.jp/%7Esd5a-ucd/rec-html401j/struct/text.html#edef-BR )]より ><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> と改行せずに書き込むと、ブラウザに表示された表の直前は改行されませんでした。
その他の回答 (2)
- YkazubonY
- ベストアンサー率30% (26/86)
<textarea>タグ内に<table>タグを記述しようなんて、初めて聞きました。 普通は逆なんじゃないですか。www
お礼
ご回答ありがとう。 えーっと・・・、 言わずもがな。 そんなことは承知の上。 普通のことだったら聞かないから。 必要性があって、やってるのね。 でわ。
- ORUKA1951
- ベストアンサー率45% (5062/11036)
>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-html401j/struct/tables.html#edef-TABLE )]より 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-html401j/struct/global.html#h-7.5.3 ) なんたらかんたら<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>)させているのでしょうか。 処理の内容が、勉強不足にて理解できていません。 ご教授願えませんでしょうか。 よろしくお願い申し上げます。
補足
ご回答、重ねてありがとうございます。 やはり初心者の私のレベルでは、ちょっと難しかったので、 以下のように、やや強引に改行を排除しました。(邪道ですが) ↓================================== 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; ↑================================== 今後、もっと勉強いたします。 ありがとうございました。