管理 | 差分 || 新規作成 || カテゴリ一覧 | ページ一覧 | 更新履歴 | 差分履歴 || アンテナ || PUT || more≫ ≫omit
shortcut: FrontPage || WikiLab | StoreRoom/最新 | 日々の泡 | むず痒いパソコン日記/最新 || HelpPage ||[edit]
category: WikiLab/WorkReport

WikiLab/WorkReport/LF - 改行コードのお勉強。

LastModified : Wed Jun 18 10:53:42 2003
[管理]

改行コードのお勉強。

お勉強の日付:2003/05/29(Thu)
ページ作成の日付:2003/06/18(Wed)

note

[TOP↑] [管理]

疑問。

[TOP↑] [管理]

ここまでは割にすぐに判ったんだけど、「末尾に改行があるのは当たり前じゃん」という疑問にぶち当たる。

$line =~ s|\s\.\r$|<br />|g;    #末尾に、スペース ピリオド 改行
$line =~ s|\s\.\r|<br />|g;     #スペース ピリオド 改行

上の二つが同じように意図通りに <br> に置換される。$ の存在意義って何!? 辺りから始まって、改行コードのお勉強をしてみました。

「改行」と「行の末尾」の「私定義」の罠。

[TOP↑] [管理]

新たな疑問:OS による改行コードの違い。

[TOP↑] [管理]

正解編。

[TOP↑] [管理]

GuestPage のログ。

[TOP↑] [管理]

AKira51 2003年05月29日(木) 00:53 

ご無沙汰しております。WikiLab/BeginnerGuidance/WikiRules にある改行ルールの追加を 利用したかったのですが今日は挫折しました。実装したい仕様は

1.「行末が .(スペース・ピリオド)なら改行」

というものなのですが、sub inlineに次のような置換文を追加してみると....

$line =~ s|\s\.$|<br/>|g;  		

プレビューのときのみ反映されない不具合があります。 問題点をご存知でしたら教えて下さい。


う〜ん、プレビューと保存後の表示で、動作が違うってことはないような気がするんですが、何ででしょう。 と思って、こちらのテスト用の Wiki に上のルールを追加したら、保存後も無視されてしまいました。何ででしょう。

$line =~ s|\s\.|<br/>|g; にしちゃって、「末尾でなくても改行」だと巧く行くんですけど(違)。 全然正規表現を覚えてないのでリファレンスを引いてはみたものの、\s\.$ の何がいけないのかは判らないです。 う〜ん、誰か識者が通りかかってくれないものか(^-^;)。

これで巧く行きましたが、どうでしょうっ。つまり、「末尾に、スペースと、ピリオドと、改行文字」で、<br> なんじゃないかと。 http://jm.vis.ne.jp/sbox/test/wal/wiki.cgi?test

ちょっと、「末尾に改行文字」ってなんか変な気がして、$line =~ s|\s\.\r|<br />|g; としてみたら、案の定、これでも巧くいってしまいました。… $ って、本当はどうやって使うんだろう…。


これって改行文字を含んでいる文字列を対象に置換を行ってると思うんで、正常な動作では?

$line =~ s|\s\.[\r\n]*$|<br />|g;

というわけで、末尾に改行文字があってもいいようにこんな正規表現を使ってみたらどうでしょう?(未テストですが…)

っていうかなんか気が付いたら↓で検索されてるし…(^^;


あ、識者の方が通りかかっている…!

ありがとうございます。http://jm.vis.ne.jp/sbox/test/wal/wiki.cgi?test こっちの(実は複数コメント設置で使った)テスト Wiki にごちゃごちゃ独り言を書いてたんですが、どうやら「私定義」で「末尾」を「改行の直前」とほぼイコールに考えてたので、$ の存在意義に疑問を感じてしまったようです。

で、とても自信なく $line =~ s|\s\.[\r\n]$|<br />|g; まで辿り付いてたんですが、やっぱり \n っているんですね。$ の前のアスタリスクの存在意義については、またこれから考えます…。

あ、上のテスト Wiki は現在 $line =~ s|\s\.[\r\n]*$|<br />|g; になってます。ちゃんと動いているようです。

↓検索<ええと、何も書いてないときにちょっと寂しかったものですから(^-^*)ゞ。


$の前のアスタリスクの存在意義は改行コードがCR+LFでもLFでもCRでも改行コード無しでも対応できるようにです。(必要かどうかは分かりませんが(笑))

"あいうえお .\r\n"
"かきくけこ .\r"
"さしすせそ .\n"
"たちつてと ."

空白文字、ピリオド、\rまたは\nが0個以上、で文字列の末尾にマッチする正規表現なので、$lineの内容が上のどれでもマッチします。 inline()は行単位の処理なんで、改行コードがどうであってもその行の末尾を判定できるようにしておいた方が確実だと思います。


あ、0 ってことがないとは限らないってことですか。多分解ったと思います(多分?)。

そういうところまで考えるのが、とっても難しいです。 大抵、自信 30% くらいでやってみて、「一見巧く動く」とそこで満足してしまって、他の可能性までは頭が回らない。どころか、実は私が意図したのと全く違う理屈で動いているのに、偶然結果が一致してただけ、ということがずっと後で判ったり。たまに可能性にぼんやり気付きながら、面倒がって無視してしまったり(笑)。

さらに、今「解った」と思ってるのも、実は全く誤解だったことが数日後判明したり…(!)。

わずか数十分後に誤解部分発覚。「\r または \nが、0個以上」ですね。誤解というか、理解が一部あやふやでした。2003/05/29(Thu) 20:26:40

とても勉強になってしまったので、後日この一連のお話は WikiLab/ナントカ で別ページ作って保存します。


またちょっと気が付いたんですけど、改行コードまで一緒に置換しちゃうと副作用が出ないとも限らないので↓の正規表現にして、改行コードはそのまま残すようにした方がいいかも?

$line =~ s|\s\.([\r\n]*)$|<br />$1|g; 

言われてみて、すごく素朴に「改行コードまで一緒に置換」しているのに、「むしろ、どうしてデータが変にならないんだろう」と一瞬悩んでしまいました。…単に表示の話で、データの書き込み時に変換されるわけではなかったんでした…。やっぱり平和なあったか頭…。

テスト Wiki、$line =~ s|\s\.([\r\n]*)$|<br />$1|g; にしてみました。


これまでのご意見を受けて、

2.ピリオドだけの行は空行に置換する を追加してみましたのでご報告まで

$line =~ s|^\.([\r\n]*)$|<p> </p>|g; 

それだとタグの入れ子が不正にならないですか?

文字列A
.
文字列B

とすると

<p>文字列A
<p> </p>
文字列B</p>

になってしまうと思うんですが(<p>の中には、どんなブロックレベル要素も入れられませんので)。 ブロックレベルのルールを追加するなら、text_to_html のほうがいいかもしれません。

shortcut: FrontPage || WikiLab | StoreRoom/最新 | 日々の泡 | むず痒いパソコン日記/最新 || HelpPage || [edit]
select css: default | sakura | mono | greenheck | snow | NN4.x用(多分) || LinuZau!! | VikiWiki!? || others |

管理 | 差分 || 新規作成 || カテゴリ一覧 | ページ一覧 | 更新履歴 | 差分履歴 || PUT