ハマったのでメモ。
データベースに正規表現と後方参照のリストを保存したいという得体の知れない欲求を抱いたのがそもそもの始まりでした。
たまたまテキスト置換が日常茶飯事に行われる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ってほんとかわいい奴だなって思いました。
[429] [429] Client error: `POST https://webservices.amazon.co.jp/paapi5/getitems` resulted in a `429 Too Many Requests` response: {"__type":"com.amazon.paapi5#TooManyRequestsException","Errors":[{"Code":"TooManyRequests","Message":"The request was de (truncated...)