2005/02/15
改行変換って結構強引やね。
さくら日記帳に限らず掲示板などでは必ず使われる改行タグ BR。
これ、s/\n/<br>\n/ だけすりゃぁいいとか思ったら大間違い。
たとえば HTML タグの後ろで改行した場合、普通は入れないはずの BR タグが入れたくもないのに入ってしまう。
それを正規表現一発でどう変換しようかと考えていたらいつの間にか頭から煙が出ていたのだが (ぉ、ぐぐる先生に聞いてみたところ有力な情報をゲッツ。




やっぱり考えることはおなじくごり押しかよ。_no




で、そのことをチャットで話してたらかいちょもそのコードを適用したらしく。
つーわけでネタも似たようなもんなのでトラックバックしてみる

で、さくら日記帳 for MySQL で使っているごり押し部分。
前作のさくら日記帳 Rev-2.0.0 BETA では PRE タグ処理が分離していたが、今回は BR タグ変換と統合。
PRE タグは BR タグを付けると二重改行になるのでこうした小細工が必要なり。
ちなみに二重改行は BR の連続になるが、P タグに変換するのがマンドクセ('A`)ので諦めた。(ぉ

# PRE タグ検知フラグ
my $pre_tag_flag = 0;
# バッファ
my $wd_tmp;

# \n (LF) でぶつ切りにする
# \r? は \r (CR) が無くてもおkという事
foreach my $line (split(/\r?\n/, $wd)) {
# <PRE> タグの扱いは特殊。この順序と if の使い方が大事。
# まずは <pre> もしくは <pre style=""> などが含まれる文字列を見つけた場合は PRE タグ検知フラグを立てる。
    if ($line =~ /<pre( .*?)?>/) { $pre_tag_flag = 1; }
# PRE タグ検知フラグが立っているか、もしくは $regex で指定したタグが見つかれば BR タグは付けない。
    if ($pre_tag_flag || $line =~ /<\/?($regex .*?|$regex)>$/) { $wd_tmp .= "$line\n"; }
# そうで無い場合は BR タグを付ける。
    else { $wd_tmp .= "$line<br>\n"; }
# もし /PRE タグが見つかれば PRE タグ検知フラグをクリア。
    if ($line =~ /<\/pre( .*?)?>/) { $pre_tag_flag = 0; }
}
# バッファの内容をメインバッファに移す。
$wd = $wd_tmp;


  - NO COMMENT -
QRコード
携帯サイト試験運用
https://griffonworks.net/nikki/cgi-bin/k.cgi
1行板

備忘録
  • 無し
物欲リスト
  • Canon RF50mm F1.2L USM
  • SIGMA 20mm F1.4 EF Art
  • ニンバス チヌーク
  • OCB-1 ST II
ツーリング ドライブ兼野外撮影予定リスト