• ベストアンサー

htmlファイルの改行について

複数ある html ページから、改行部分( <BR> ではなくて )、を自動的に削除して再び保存する、というプログラムを自作しているのですが、\r\n, \r, \n に当てはまらない改行コード? があるみたいで、完全に取りきれないのです。 $input =~ s/\n\r//g; $input =~ s/\n//g; $input =~ s/\r//g; もしくは、 $input =~ s/\x0D\x0A|\x0D|\x0A//g; という具合にしているのですが、予想では、数行にわたるhtml タグから全ての改行が取り除かれ、一行にまとまると いうイメージがあるですが、ところどころ改行が残ります。何がいけないのでしょうか・・・

質問者が選んだベストアンサー

  • ベストアンサー
  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.5

$input =~ s/\n\r//g; $input =~ s/\n//g; $input =~ s/\r//g; ですが、一行目の\n\rが逆で\r\nだと思うのですが。 $input = s/\r\n|\r|\n//g; \rと\nだと勘違いしそうなので、 $input = s/\x0D\x0A|\x0D|\x0A//g; 参考URLをご参照ください。

参考URL:
http://www.bayashi.net/st/pdmemo/chara.html
soushi
質問者

お礼

あ、逆でしたか? すみません。ご指摘ありがとうございます。 一度は試しているんですが、s/\x0D\x0A|\x0D|\x0A//g; の方式に戻してみました。

その他の回答 (7)

  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.8

No.5のarukamunです。 $input = s/\r\n|\r|\n//g; だとサーバのOSによって正常に動作出来ない可能性があります。(\nの解釈の仕方がOSによって違うからです。) $input = s/\x0D\x0A|\x0D|\x0A//g; を使えば直接コードを指定しているので、OSに依存しないで正常に動作します。

soushi
質問者

お礼

重ね重ねありがとうございます。 釈然としないままあれこれやってましたが、原因がわかりました! IEで名前を付けて保存、とやると、いくらご指摘のコードをかましても改行が削除されない状態でPCにダウンされるんですが、FTP経由だと上記の方法でちゃんと削除できているようです。 とりあえず、これで問題はありません。 皆様どうもありがとうございました。

  • ikspiari
  • ベストアンサー率48% (29/60)
回答No.7

私も最初 No.5 さんや No.6 さんのように思ったのですが、 $input =~ s/\n//g; $input =~ s/\r//g; 上記二行だけでも全ての改行は取り除かれるハズです。 ところで、 > get 関数などでページを丸々取得して、 というのはどういう事でしょう? 何かのプログラムで HTML を取得してきているという事ですよね? 後、OS は何ですか?

soushi
質問者

お礼

ありがとうございます。 get 関数 で、任意のURLのページを丸々取得できるようです。これも悪意があるといろいろと使えそうですが・・・OSはFreeBSD でした。

  • shunet
  • ベストアンサー率28% (15/52)
回答No.6

NO.5の方 >一行目の\n\rが逆で\r\nだと思うのですが に同意します。 私が作って実際に稼動している掲示板の スクリプトを見ると \r\n としています。

soushi
質問者

お礼

どうもありがとうございます。 逆だと意味がちがってくるのでしょうね。

  • O_Denwa
  • ベストアンサー率26% (46/172)
回答No.4

最近。プログラムなんて触ってないんで、参考になるかどうかわかりませんけど。 $input =~ s/\n\r//g; $input =~ s/\n//g; $input =~ s/\r//g; で、やれば一通り、改行コード外すと思うんですけどね。 っで、改行コードは全部外れてるけど、その結果の1行があまりにも長すぎて、 使用しているエディタが、なんかの弾みで改行しているように表示してるだけ。 とかないですよね? 昔、そーいう事があったような。なかったような。 すいません。 回答しといてなんですけど、これっぽっちも自信がないです。 $input =~ s/\n\r/a\n/g; $input =~ s/\n/b\n/g; $input =~ s/\r/c\n/g; とか、改行コードをチェック付き改行コードにしといて、 これ以外に改行している部分を探してみては?

soushi
質問者

お礼

ありがとうございます。 そうですよね・・・経験者の方はそう考えると思うんです。私もまずその方法で確かめてみました。 エディタが勝手に改行しているケースは考えられないようです。 うー・・・もうちょっと四苦八苦してみます。

  • ikspiari
  • ベストアンサー率48% (29/60)
回答No.3

こういう場合は一つずつ検証していきましょう。 まず、適当に改行が入ってるテキストなどを自分で作って、それで試してみてください。 問題なく改行は取り除けるでしょうか? また、少々面倒ですが取り除けない改行(なのか?)のコードを調べてみてください。 秀丸ではなく、Perl で16進数に変換してみましょう。

soushi
質問者

お礼

度々お答えいただいて恐れ入ります。 例えばビルダーとかで作った自作ページは問題なく取れます。 get 関数などでページを丸々取得して、それから改行 コードを取り去ることができないんですね・・・どうも。 アドバイスありがとうございます。 手探りながらご指摘どおりやってみます。

  • ikspiari
  • ベストアンサー率48% (29/60)
回答No.2

なんか違う気がする。 特殊なキャラクタが入ってる可能性はありませんか? コントロールコードとか。

soushi
質問者

お礼

そう思って、皆さんにお聞きしたんです。 秀丸で空けてテキストファイルとしてながめている 限りは、特殊なコードが埋め込まれていそうにないん ですね・・・うーん、なんでだろう。 どうやら思いのほか同様の経験者がいないようで残念。

  • ikspiari
  • ベストアンサー率48% (29/60)
回答No.1

\n = LF \r = CR UNIX = LF Mac = CR Windows = CR+LF $input =~ s/\n|\r//g; LF+CR という改行コードはありませんよ。

soushi
質問者

お礼

しかし、サンプルソースなんかにそう書いてあるので、 そのまま流用してるんです。 私が勝手にあみ出したワケではありません・・・