CentOS5.5でCakePHP1.3系のInflector::slugを正常動作させる方法

CakePHPでラジオボタンを出そうと思ったら、PCREとかPHPのビルドを考え直すハメになった」の続報です。CentOS5.5環境でPCREのUnicode文字プロパティを正常動作させる方法について改めてまとめます。

動作確認には、Inflector::slugに含まれる問題のパターンでpreg_replaceを実行しました。

<?php
php -r "echo preg_replace('/[^\s\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]/mu', '', 'Hoge').PHP_EOL;"

これを実行して「Hoge」が返ってくればOK、「o」になったらダメと判断します。

yumで最新版のPCREを落としてくる

昨日のエントリに追記したように、pcreパッケージのChangelogから--enable-unicode-propertiesオプションが有効化されたことが確認出来ます。

* Wed Jul 21 2010 Petr Pisar <ppisar@redhat.com> - 6.6-6
- Enable Unicode properties (Resolves: #457064)

具体的には、pcre-6.6-6以降をインストールすれば解決します。2011/05/19現在では、pcre-6.6-6.el5_6.1がリリースされています。

この場合、PHPをビルドしなおす必要があるだろうなと思って暗澹たる気持ちでいたのですが、前述のpreg_replaceが正常動作したので問題ないようです。PCREは動的にリンクされていたのですね。

RHEL5/CentOS5について言うと、標準のPHP 5.1.6はシステム標準のlibpcre.so.0を動的リンクしており、システム標準のpcreパッケージは前述の通り「No Unicode properties support」でコンパイルされていますので、RHEL5/CentOS5標準のPHPではpreg系関数でUnicode文字プロパティが使えません。

hnwさんのエントリにもしっかり記述されていました。

パッケージのアップデートが可能であれば、この方法が簡単でいいですね。今回はこれで乗り切ろうと思います。

PHPバンドルのPCREを使う

ブコメkoyhogeさんからアドバイス頂きました。ありがとうございます。

PHPをビルドするときに、PHPバンドルのPCREを使うようにすればいいんじゃね?

今までバンドル版のPCREを使ったことがなかった、というか恥ずかしながら考えたこともなかったのですが、改めて確認してみました。

バンドルPCREを使うには、PHPコンパイルオプションに「--with-pcre-regex=dir」を含めないようにすればOKです。

PCREのインストール手順のページに、バンドルPCREのバージョンについて記載があります。

少し前のバージョンになりますが、手元のPHP5.2.12をバンドルPCREを使ってビルドしたところ、以下の結果が得られました(php -iの結果より抜粋)。

pcre

PCRE (Perl Compatible Regular Expressions) Support => enabled
PCRE Library Version => 7.9 2009-04-11

Directive => Local Value => Master Value
pcre.backtrack_limit => 100000 => 100000
pcre.recursion_limit => 100000 => 100000

マニュアルの記述から、PHP5.2系はPCRE7.8で打ち止めかと思いましたが、リリース時点の最新版をバンドルしているんでしょうかね。

CentOSの標準パッケージがPCRE6.6なので、バンドル版の方がかなり新しいですね。Changelogを追う元気がありませんが、PCREの新機能を積極的に利用されている方は検討してみてはいかがでしょうか(何とかメソッド)。

なお、この場合はpcreのパッケージ自体は古い物が残っていますので、pcretestコマンドの実行結果はPHPに組み込まれたPCREの設定とは異なります。「バンドルのPCREを使っている」という認識は関係者間でしっかり共有しておきましょう。