この投稿は7年半前の記事です。 情報が古くなっている可能性があるので、その点ご了承ください。
2010 年 5 月 19 日 2,594日前)
2,625文字 (読了時間6分)

SPONSORED LINK

ハマったのでメモ。

データベースに正規表現と後方参照のリストを保存したいという得体の知れない欲求を抱いたのがそもそもの始まりでした。

たまたまテキスト置換が日常茶飯事に行われるCMSを作っていたからなんですが、要するに、こういう配列をですね、いっぱい作ってDBに突っ込んで、いつでも呼び出せるようにしておきたかったんですよ。

正規表現セットがですね、ほら、こう、あれですよ、なんかお店のメニューみたいにね。

$regs = array(
   "reg"     => array(
      "/^tel([0-9\-])+$/s"
      "/\n/"
   ),
   "backref" => array(
      "電話番号$1",
      "<br />"
   )
);
for($i = 0, $l = count($regs["reg"]); $i < $l; $i++){
   preg_replace($regs["reg"][$i], $regs["reg"][$i], $str);
}

ほら、これでどんなにたくさん正規表現を追加したって、なんの問題もないじゃないですか。

電子書籍とか作るとき、こういう方法でワンソース・マルチプラットフォームを実現しようと思ったんですよ。

いつもいつもDOMれるわけじゃないですからね。

で、問題は入力系です。

はじめはJavascriptとか使ってソータブルテーブルを作ったらね、いいと思ったんですよ。入力しやすいじゃないですか。

でもね、正直CMSのいいところって、ユーザを教育できるじゃないですか。今回は不特定多数に使われるCMSじゃなくて、業務用アプリだったんで、まあ、textareaでいいかなって思ったんですよ。

textareaを二つ用意して、改行が入るところでexplodeかまして分割すればほら素敵な配列のできあがり! ってね。

でも問題はいつだってバックスラッシュじゃないですか。

正規表現って、バックスラッシュいっぱい入りますよね。あと、シングルクォートとか、HTMLにとってもDBにとってもアレゲなものがたくさん入りますよね。

というわけで、入力系・出力系ともにいろいろ気を付けますよ。

プレースホルダー使ったり、stripslashes使ったり。

でもまあ、ここまでは別に良かったんですよ。

当然CMSなんで、入力・出力・更新・削除があるじゃないですか。

困ったのは更新ですよ。

更新するからには、元のデータを一回出力して、ユーザがそれを修正できなきゃダメじゃないですか。

だから僕はこういう風に出力されたらいいなって思ったんですよ。

<textarea name="reg">/^tel([0-9\-])+$/s
/\n/</textarea>
<textarea name="backref">電話番号$1
<br /></textarea>

こうすれば、ユーザにとって入力したときと同じ結果が見えるので、更新もし易いですよね。

で、問題はtextarea内での改行ですよ。

今回はFirefoxを使ったんですが、textareに入っていたデータをPHPで受け取ると、改行部分が\r\nになってたんですね。

ぶっちゃけ蝶ラッキーって思いました。

正規表現を適用するDBのコンテンツデータは改行コードLFなんで、単純にexplode(“\r\n”, $_POST[“reg”])しちゃえば配列が取れるじゃないですか。

ってことはですよ、ユーザに対して出力するときだって、implode(“\r\n”, $arr)ってやれば済むと思うじゃないですか。

ところがなんないんですよ。

<textarea name="reg">/^tel([0-9\-])+$/s\r\n/\n/</textarea>
<textarea name="backref">電話番号$1\r\n<br /></textarea>

なんか\r\nがそのまま出力されてるんですよ。あれーってなるじゃないですか。
で、僕はバックスラッシュがうまく処理されてないのかなって思って、こうやるわけですよ。

<?php
$str = stripshashe(implode("\\r\\n", $reg));
?>
<textarea name="reg"><?php echo $str; ?></textarea>

ところが全然ダメなんですね! で、ググるじゃないですか。

そうすると、nl2br使えとか得意気にいってるページしかヒットしないんですよ。

途方にくれましたよ。

で、まさかと思ってこうやってみたわけです。

$str = implode("
", $reg));
?>
<textarea name="reg"><?php echo $str; ?></textarea>

これでうまく行ったんですよ…

理由はまったくわかりません。でも、PHPってほんとかわいい奴だなって思いました。

正規表現クックブック

正規表現クックブック [書籍]

著者Jan Goyvaerts, Steven Levithan

クリエーター長尾 高弘

出版社オライリージャパン

出版日2010 年 4 月 15 日

商品カテゴリー大型本

ページ数552

ISBN4873114500

Supported by amazon Product Advertising API

 

フォローしてください

ここで会ったのもなにかの縁。
高橋文樹.comの最新情報を見逃さないためにもフォローをお願いします。
めったに送らないメルマガもあります。

SPONSORED LINK

この記事について

この記事はが2010 年 5 月 19 日にプログラミングの記事として公開しました。

高橋先生の電子書籍

高橋先生の電子書籍

Amazonで電子書籍も買えます。

好きな言葉

清潔であることは、貧しい者たちを社会にも受け入れられる存在にしたのである。

— ペーター・ハントケ

高橋先生の処女作

『途中下車』高橋文樹

2001年幻冬舎NET学生文学大賞受賞作です。

Web制作やります

Web制作やります

Web制作のご依頼は株式会社破滅派へ

不定期メルマガ

高橋文樹.comでは、不定期でニュースレターを配信しています。滅多に送らないので是非購読してください。

高橋文樹.comではプライバシーポリシーに準じて登録情報を取り扱います。