字串處理機制修改


一、含有十六進位字元的字串不再視為數字

含有十六進位字元的字串不再視為數字,也不再區別對待。例如下面的程式碼:

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函數來檢查一個字串是否包含十六進位字元或是否可以轉成一個整數
$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)

二、\u{後面如果包含非法字元會報錯

雙引號和heredocs語法裡面增加了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)