2007-03-30

checkboxやselectを同期させるJavascriptって

 先日inputなどが所属しているformを調べていたのはcheckboxやselectを同期させるJavascriptを書くためだったのですが、「formに所属してるinput要素をピックアップしたほうが早いじゃん!」って事に気づいて*1結局使わなかったという。

 ところで、こんな感じだと重複してデータを送信しちゃうしradioで同期ができないし、こんな風だとテーブル組には使えないんだけど*2、うまい方法があったりするんでしょうかね。

preg_replace()をPerlと同じつもりで使ってハマる。

 相変わらずピンポイントでハマるPHPですが。

 Perl

$date =~ s#\d{2,4}[/-](\d{1,2})[/-](\d{1,2})#sprintf("%d/%d", $1, $2)#e;

――って正規表現を書くのと同じ動作をすると思ってPHP


$date = preg_replace('#\d{2,4}[/-](\d{1,2})[/-](\d{1,2})#e', 'sprintf("%d/%d", $1, $2)', $date);
?>

――と書いたのですが、うまく動かないんですな。正確には、ほとんどのデータはうまく処理されてるのに「2007/08/04」が「8/4」にならずに「0/4」になっていたんですよ。

 最初は理由が分からずにしばらく悩んでいたのですが、途中で「sprintf("%d/%d", $1, $2)」が「sprintf("%d/%d", 08, 04)」に変換されてからPHPとして実行されてることに気づき修正したのですが*3、これってPHPを使っている人的には問題ないんでしょうかね*4

*1:当初はonChangeとか書いてた。HTMLのテンプレートで出力してるから特に何も考えてなかったのです……。

*2:それともformでtrを囲ってもいいものかな?

*3Perlは「sprintf("%d/%d", $1, $2)」のまま実行してるはず。少なくとも上記はちゃんと「8/4」になります。

*4PHPを使ってる人はpreg_*なんて使わないのかもしれないけど。