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 ブロックのサポートを期待したいですね。