複数行にまたがってパターン検索したい時は、「マルチラインモード」じゃなくて「シングルラインモード」で検索するもんだと今頃気がついた水曜日の夜。

どうもご無沙汰してます。にしふなです。

正規表現で、デリミタ(/)の後にiだかgだとか入れて、いろんなことができて幸せになれる機能があるじゃないですか。
その機能の中に、複数行にまたがってパターンをマッチさせるか否か、と言う機能があるじゃないですか。ありますよね。
俺はそれを、単一行マッチを「シングルラインモード」、複数行マッチを「マルチラインモード」だと思ってたんですね。
でも実際は、複数行マッチさせたい場合はシングルラインモードを使うみたいなんですね。

なぜなら、「マルチ」、「シングル」は、「検索される側の文字列」(php風にいえば$subject)を、一行として扱うか、それとも複数行として扱うか、と言う違いを切り替える言葉なんですね。

例えば、下記のように人が見やすいように改行・インデントが加えられたソースコードがあったとします。

このようなソースコードに「シングルラインモード」を適用すると、以下のように扱われるみたいです。

つまり、改行・インデントといった、整形に関わる記号をすべて「通常の文字」として扱い、「検索される側の文字列」を1行としてみなすモードが「シングルラインモード」と言うことみたいなんですね。
と言うことは、正規表現の挙動はどちらのモードでも変わってないということになりますね。シングルでもマルチでも、1行分しかパターンを適用していないです。

とりあえず結論は、複数行にまたがって検索したい時は「シングルラインモード」で検索しろ!ってことですね。
ちなみに俺は、このことに気づくまで1時間ぐらいウンウン唸ってました。なんというかお恥ずかしい……(;ω;`)

でもですね、言い訳じみた感じになってしまって恐縮ですが、Web上で正規表現のチェックが出来る「PHP正規表現チェッカー」さんでは、複数行にまたがってパターン検索するときには「マルチラインモード(m)」にチェックを入れるんですよ!! これはかなり混乱してしまいました……まじどっちなんだよとorz
でも、このツール自体はかなり便利なので、気にせず使っていくと思いますけどね。
http://www.rider-n.sakura.ne.jp/regexp/regexp.php

Zend FrameworkからGoogle CalendarのAPIを利用してイベントの追加をするとき、Author属性は書き込める?

タイトルの通り、Google Calendar にAPI経由でイベントの追加をする際に、Author属性(カレンダーのイベントの作成者)をどうやって書きこんだらいいか?という件です。

自分が使っているZend Frameworkのバージョンは1.9.6です。最新バージョン(1.11.11)でも変わらないと思います。

結論から言うと、書き込めないみたいですね(´;ω;)

まず自分が参照したZendFrameworkのマニュアルの中の1ページ「Google Calendarの使用法」(http://framework.zend.com/manual/1.9/ja/zend.gdata.calendar.html)には、Author属性についてはこう書いてあります。

その他、オプションで設定できる属性は次のようになります。

  • Author は、そのイベントを作成したユーザについての情報です。

この文面を読む限り、Authorは設定できるものだと思いますよね??でもサンプルコードにはAuthorの書き方は書いてないし、マニュアル以外の記事にもそれらしいものは載ってませんでした。

仕方ないので、Google本家の「Data API Developer’s Guide: PHP」(http://code.google.com/intl/ja/apis/calendar/data/1.0/developers_guide_php.html#CreatingEvents )をのぞいてみたら、こんなことが書いてありました。

Other useful functions include but are not limited to:

  • author, retrieved using getAuthor, can be used to access the user who created the event. Note that the calendar API will not accept user-submitted updates to this attribute.

多分、「APIじゃこの属性はいじれないよ!」みたいなことでも書いてあるんですかね?英語よくわかんない(つД`)

とりあえず、この文面を見る限りはAuthor属性は変更できないみたいです。この問題でかなりの時間ハマってしまいました。トホホorz

[PHP] foreach内で参照渡しをしたときに、参照が死なずに残ってしまうのはなぜか

どうもこんにちは。

PHPをいじっていて少し引っかかったことがあったのでメモメモ……

foreach文の中で、 引数として渡している配列の中身を変更するために、参照渡し(&$hogeみたいな感じで書く)を利用してみました。
↓例えばこんな感じで

こうすると、配列$aryHogeの中身がちゃんと変更されます。
でも、下記のように書くと、なんだかおかしなことになります。

上記のように書くと、最初の配列$aryHogeの値が書き変わってしまいます。
どうやら、 foreachで作成した変数$itemに、$aryHogeの参照が残ったままになっているみたいです。

仕方ないので、とりあえず場当たり的に、2つ目のforeachの変数を$valのような別の名前に変えて対処しましたが、何でこうなるのか気になったので調べてみたら、すぐに引っかかりました。

foreachの参照 – CROOZ Tech Blog http://techblog.crooz.jp/?p=4738

最後に注意点として、PHPにはブロックスコープがないので
foreachで作成した$keyや$valueは、foreachを抜けても値が入ったままです。

なので参照渡しでつかった$valueにうっかり値をいれてしまうと…
参照先の値が書き換わってしまいます。
なので忘れずにunsetしましょう。

「ブロックスコープがない」。if文やらfor文やらの内部で宣言した変数が外でもそのまま使えるってことですわね。
これって、宣言も代入も同じ構文のPHPなんかじゃ、ミスの温床になるんじゃないかしら??

ここまで書いていて気がついたのですが、自分もよくif文の中で初めて宣言した変数なんかに平気でアクセスしてました。今になって考えると無意識にそんなことをしてたんですな……なんだか恐ろしい(;ω;`)