はじめに
mbstring
に含まれる 鬼車(Oniguruma
)(mb_ereg_*
系関数の正規表現ライブラリー)のバージョンが、PHP7.2 から 6.3.0
がベースとなった。(PHP5.6-7.1 は、5.9.5
がベース。)(鬼車 6.0.0
で、 update Unicode data to 8.0.0
となった。(鬼車の履歴))
そのため、以下のスクリプトは、真逆の結果を返す。(https://3v4l.org/NeqNo)
<?php
//echo 'PHP_VERSION: ', PHP_VERSION, "\n";
mb_regex_encoding('UTF-8') || exit("mb_regex_encoding('UTF-8') error.");
foreach (['0085', '180e'] as $hex) {
$utf8 = mb_convert_encoding(pack('N', hexdec($hex)), 'UTF-8', 'UTF-32BE');
echo "U+{$hex}", (mb_ereg_match('\A[\s]\z', $utf8) ? ' match \\s !' : '')."\n";
}
foreach (['00ad', '200B'] as $hex) {
$utf8 = mb_convert_encoding(pack('N', hexdec($hex)), 'UTF-8', 'UTF-32BE');
echo "U+{$hex}", (mb_ereg_match('\A[[:cntrl:]]\z', $utf8) ? ' match cntrl !' : '')."\n";
}
Output for 7.2.0
U+0085 match \s !
U+180e
U+00ad
U+200B
Output for 5.6.0 - 5.6.30, hhvm-3.18.5 - 3.22.0, 7.0.0 - 7.1.12
U+0085
U+180e match \s !
U+00ad match cntrl !
U+200B match cntrl !
変更点の一部をピックアップ
サポートするUnicode 文字プロパティーが増えた
PCRE(preg_*
) のUnicode 文字プロパティ でサポートされていないプロパティを含む、
UTF8, UTF16, UTF32で有効なプロパティ名一覧は、Unicode Properties (from Unicode Version: 8.0.0) を参照
\s
([:space:]
, [:blank:]
) は、U+180E
が対象外となった。
U+180E (Mongolian Vowel Separator)
は、
[:White_Space=Yes:] に含まれないが、
Unicode8.0.0 で、スペースとしてリストされている。また、PCRE(
preg_*
) では、U+180E (Mongolian Vowel Separator)
は、space characters
扱いとなっている。
/* Character U+180E (Mongolian Vowel Separator) is not included in the list of spaces in the Unicode file PropList.txt, and Perl does not recognize it as a space. However, in many other sources it is listed as a space and has been in PCRE (both APIs) for a long time. */
-
php-7.2.0/mbstring/oniguruma/unicode_property_data.c#L2792
/* PROPERTY: 'Space': POSIX [[:Space:]] */ static const OnigCodePoint CR_Space[] = { 10, 0x0009, 0x000d, 0x0020, 0x0020, 0x0085, 0x0085, 0x00a0, 0x00a0, 0x1680, 0x1680, 0x2000, 0x200a, 0x2028, 0x2029, 0x202f, 0x202f, 0x205f, 0x205f, 0x3000, 0x3000, }; /* END of CR_Space */
-
php-7.1.12/mbstring/oniguruma/unicode.c#L2012
/* 'Space': [[:Space:]] */ static const OnigCodePoint CR_Space[] = { 11, 0x0009, 0x000d, 0x0020, 0x0020, 0x0085, 0x0085, 0x00a0, 0x00a0, 0x1680, 0x1680, 0x180e, 0x180e, 0x2000, 0x200a, 0x2028, 0x2029, 0x202f, 0x202f, 0x205f, 0x205f, 0x3000, 0x3000 }; /* CR_Space */
[:cntrl:]
の対象文字
-
php-7.2/mbstring/oniguruma/unicode_property_data.c#L678
/* PROPERTY: 'Cntrl': POSIX [[:Cntrl:]] */ static const OnigCodePoint CR_Cntrl[] = { 2, 0x0000, 0x001f, 0x007f, 0x009f, }; /* END of CR_Cntrl */
-
php-7.1.12/mbstring/oniguruma/unicode.c#L517
/* 'Cntrl': [[:Cntrl:]] */ static const OnigCodePoint CR_Cntrl[] = { 19, 0x0000, 0x001f, 0x007f, 0x009f, 0x00ad, 0x00ad, 0x0600, 0x0603, 0x06dd, 0x06dd, 0x070f, 0x070f, 0x17b4, 0x17b5, 0x200b, 0x200f, 0x202a, 0x202e, 0x2060, 0x2063, 0x206a, 0x206f, 0xd800, 0xf8ff, 0xfeff, 0xfeff, 0xfff9, 0xfffb, 0x1d173, 0x1d17a, 0xe0001, 0xe0001, 0xe0020, 0xe007f, 0xf0000, 0xffffd, 0x100000, 0x10fffd }; /* CR_Cntrl */