PHP7.2 の 鬼車(Oniguruma)(mb_ereg_*)の変更点の一部をピックアップ

## はじめに

`mbstring` に含まれる 鬼車(`Oniguruma`)(`mb_ereg_*`系関数の正規表現ライブラリー)のバージョンが、PHP7.2 から [`6.3.0` がベース](http://www.php.net/ChangeLog-7.php#7.2.0)となった。(PHP5.6-7.1 は、[`5.9.5` がベース](http://php.net/ChangeLog-5.php#5.6.0)。)(鬼車 `6.0.0` で、 `update Unicode data to 8.0.0` となった。([鬼車の履歴](https://github.com/php/php-src/blob/master/ext/mbstring/oniguruma/HISTORY)))

そのため、以下のスクリプトは、真逆の結果を返す。(https://3v4l.org/NeqNo)

```php
<?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

```sh
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

```sh
U+0085
U+180e match \s !
U+00ad match cntrl !
U+200B match cntrl !
```

## 変更点の一部をピックアップ

### サポートするUnicode 文字プロパティーが増えた

PCRE(`preg_*`) の[Unicode 文字プロパティ](http://php.net/manual/ja/regexp.reference.unicode.php) でサポートされていないプロパティを含む、
UTF8, UTF16, UTF32で有効なプロパティ名一覧は、[Unicode Properties (from Unicode Version: 8.0.0)](https://github.com/php/php-src/blob/php-7.2.0/ext/mbstring/oniguruma/doc/UNICODE_PROPERTIES) を参照

### `\s`(`[:space:]`, `[:blank:]`) は、`U+180E` が対象外となった。

> `U+180E (Mongolian Vowel Separator)` は、
> [\[:White_Space=Yes:\]](https://unicode.org/cldr/utility/list-unicodeset.jsp?a=[:White_Space=Yes:]) に含まれないが、
> [Unicode8.0.0 で、スペースとしてリスト](http://www.unicode.org/versions/Unicode8.0.0/ch06.pdf#page=11)されている。
>
> また、PCRE(`preg_*`) では、 `U+180E (Mongolian Vowel Separator)` は、`space characters` 扱いとなっている。
> -   [pcre2.txt](https://vcs.pcre.org/pcre2/code/trunk/doc/pcre2.txt?view=markup)
> -   [pcre/pcre2_internal.h?rev=39](https://vcs.pcre.org/pcre2/code/trunk/src/pcre2_internal.h?r1=39&r2=38&pathrev=39)
>
>     ```c
>     /* 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](https://github.com/php/php-src/blob/php-7.2.0/ext/mbstring/oniguruma/src/unicode_property_data.c#L2792)

    > ```c
    > /* 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](https://github.com/php/php-src/blob/php-7.1.12/ext/mbstring/oniguruma/enc/unicode.c#L2012)

    > ```c
    > /* '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](https://github.com/php/php-src/blob/php-7.2.0RC6/ext/mbstring/oniguruma/src/unicode_property_data.c#L678)

    > ```c
    > /* 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](https://github.com/php/php-src/blob/php-7.1.12/ext/mbstring/oniguruma/enc/unicode.c#L517)

    > ```c
    > /* '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 */
    > ```

## 参考

### ドキュメント

-   [php-7.2.0(鬼車 正規表現 Version 6.3.0    2017/05/19)](https://github.com/php/php-src/blob/php-7.2.0/ext/mbstring/oniguruma/doc/RE.ja)
    -   [Unicode Properties (from Unicode Version: 8.0.0)](https://github.com/php/php-src/blob/php-7.2.0/ext/mbstring/oniguruma/doc/UNICODE_PROPERTIES)
-   [php-7.1.12(鬼車 正規表現 Version 5.9.1    2007/09/05)](https://github.com/php/php-src/blob/php-7.1.12/ext/mbstring/oniguruma/doc/RE.ja)

### 定義(ソース)

-   [php-7.2.0/mbstring/oniguruma/unicode_property_data.c](https://github.com/php/php-src/blob/php-7.2.0/ext/mbstring/oniguruma/src/unicode_property_data.c)
-   [php-7.1.12/mbstring/oniguruma/unicode.c](https://github.com/php/php-src/blob/php-7.1.12/ext/mbstring/oniguruma/enc/unicode.c)

([Onigmo/unicode/name2ctype.h](https://github.com/k-takata/Onigmo/blob/master/enc/unicode/name2ctype.h))