文字列処理機構の変更


1. 16 進数文字を含む文字列は数値として扱われなくなりました

16 進数文字を含む文字列は数値として扱われなくなり、別の方法で扱われることもなくなりました。たとえば、次のコード:

var_dump("0x123" == "291");     // bool(false)     (previously true)
var_dump(is_numeric("0x123"));  // bool(false)     (previously true)
var_dump("0xe" + "0x1");        // int(0)          (previously 16)
var_dump(substr("foo", "0x1")); // string(3) "foo" (previously "oo")
// Notice: A non well formed numeric value encountered
は、filter_var 関数を使用して、文字列に 16 進文字が含まれているかどうか、または整数
$str = "0xffff";
$int = filter_var($str, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX);
if (false === $int) {
    throw new Exception("Invalid integer!");
}
var_dump($int); // int(65535)

2 に変換できるかどうかを確認できます。 \u{後で不正な文字が含まれている場合、エラーが報告されます

Unicode コード ポイント エスケープ構文が二重引用符とヒアドキュメント構文に追加されました。「\u{」の後には utf-8 文字が続く必要があります。非 utf-8 文字の場合、エラーが報告されます:

$str = "\u{xyz}"; // Fatal error: Invalid UTF-8 codepoint escape sequence
最初の \ をエスケープすることで、このエラーを回避できます。
 $str = "\u{xyz}"; // Works fine

「\u」の後に { がない場合、効果はありません:

$str = "\u202e"; // Works fine

##PHP IntlChar()

PHP 7 は、intl 拡張子による国際化 (i18n) とローカリゼーション (l10n) をサポートしています。この拡張機能は、ICU ライブラリの基本的なラッパーにすぎず、ICU ライブラリに同様のメソッドと機能を提供します。

PHP 7 は、新しい IntlChar クラスを通じて ICU の Unicode 文字機能を公開します。このクラス自体は、複数の文字セットの Unicode 文字を操作するための多くの静的メソッドを定義します。

<?php
printf('%x', IntlChar::CODEPOINT_MAX);
echo IntlChar::charName('@');
var_dump(IntlChar::ispunct('!'));
?>

上記のプログラムの実行出力は次のとおりです:

10ffff
COMMERCIAL AT
bool(true)