portsnap してみたら PCRE がバージョン 6.6 になっていたので、変更点は何だろうと思い ChangeLog を読んでみたところ 6.5 のバグフィクス的な位置づけのよう。続いて 6.5 の新機能を見ると、
18. Changes to the handling of Unicode character properties:
(a) Updated the table to Unicode 4.1.0.
(snip)
(d) Added support for Unicode script names via properties such as \p{Han}.
と、Unicode スクリプト名が使えるようになっていたので、さっそく PHP で試してみました。
まずは PCRE をインストール。
PREFIX="$HOME/Applications/php51-pcre66" ./configure --prefix="$PREFIX" --enable-utf8 --enable-unicode-properties make make install
続いて PHP 5.1.2 を最小限のオプションで。
PREFIX="$HOME/Applications/php51-pcre66" ./configure --prefix="$PREFIX" --disable-all --without-all \ --disable-cgi --enable-cli --with-pcre-regex="$PREFIX" make make install
これで準備完了。pcre-6.6/ucp.h を参考にあてずっぽうで正規表現を書いてテスト。
(とりあえず書いてあったもの全部を使ってますが、通常の和文+欧文のテキストではここまでやる必要は皆無です)
cat /tmp/pcre66test.php <?php $pattern = '/(\\p{Arabic}+|\\p{Armenian}+|\\p{Bengali}+|\\p{Bopomofo}+|\\p{Braille}+ |\\p{Buginese}+|\\p{Buhid}+|\\p{Canadian_Aboriginal}+|\\p{Cherokee}+|\\p{Common}+ |\\p{Coptic}+|\\p{Cypriot}+|\\p{Cyrillic}+|\\p{Deseret}+|\\p{Devanagari}+ |\\p{Ethiopic}+|\\p{Georgian}+|\\p{Glagolitic}+|\\p{Gothic}+|\\p{Greek}+ |\\p{Gujarati}+|\\p{Gurmukhi}+|\\p{Han}+|\\p{Hangul}+|\\p{Hanunoo}+|\\p{Hebrew}+ |\\p{Hiragana}+|\\p{Inherited}+|\\p{Kannada}+|\\p{Katakana}+|\\p{Kharoshthi}+ |\\p{Khmer}+|\\p{Lao}+|\\p{Latin}+|\\p{Limbu}+|\\p{Linear_B}+|\\p{Malayalam}+ |\\p{Mongolian}+|\\p{Myanmar}+|\\p{New_Tai_Lue}+|\\p{Ogham}+|\\p{Old_Italic}+ |\\p{Old_Persian}+|\\p{Oriya}+|\\p{Osmanya}+|\\p{Runic}+|\\p{Shavian}+ |\\p{Sinhala}+|\\p{Syloti_Nagri}+|\\p{Syriac}+|\\p{Tagalog}+|\\p{Tagbanwa}+ |\\p{Tai_Le}+|\\p{Tamil}+|\\p{Telugu}+|\\p{Thaana}+|\\p{Thai}+|\\p{Tibetan}+ |\\p{Tifinagh}+|\\p{Ugaritic}+|\\p{Yi}+)/ux'; $subject = 'PCRE 6.6 - 漢字かなカナ交じりの文章'; $limit = -1; $flags = PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY; if ($words = preg_split($pattern, $subject, $limit, $flags)) { print_r($words); } ?>
現状の PHP デフォルトでは
php /tmp/pcre66test.php Warning: preg_split(): Compilation failed: unknown property name after \P or \p at offset 10 in /tmp/pcre66test.php on line 18
とエラーが出るけど、PCRE 6.6 をリンクした PHP では
~/Applications/php51-pcre66/bin/php /tmp/pcre66test.php Array ( [0] => PCRE [1] => 6.6 - [2] => 漢字 [3] => かな [4] => カナ [5] => 交 [6] => じりの [7] => 文章 )
と、期待通りに文字種で分かち書きされました。
Unicode スクリプトが使えると正規表現がとても楽になるので、次のバージョン (5.1.3/4.4.3) ではぜひ PCRE 6.6 をバンドルしてほしいものです。
そして、PCRE には将来のバージョンで Unicode ブロックのサポートを期待したいですね。