欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP中信息格式化操作詳解(MessageFormatter類)

 更新時間:2021年07月12日 10:04:54   作者:PHP開源社區(qū)  
這篇文章主要給大家介紹了關(guān)于PHP中信息格式化操作的相關(guān)資料,主要運用的是專門用于信息格式化的MessageFormatter類,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下

前言

在國際化組件的學習過程中,我們已經(jīng)接觸過了 NumberFormatter 這種數(shù)字的格式化操作,它可以讓我們將數(shù)字轉(zhuǎn)換成標準格式、貨幣、本地語言等形式。今天我們來學習的是另一種專門用于信息格式化的類 MessageFormatter ,它主要是針對字符串的操作。

MessageFormatter 也是遵循的 ICU 規(guī)范,底層是 C 中的 ICU 操作,所以和 C 相關(guān)代碼的使用方式?jīng)]有太大的區(qū)別。

格式化

// 格式化
$fmt = new MessageFormatter("zh_CN", "{0,number,integer} 只猴子在 {1,number,integer} 顆樹上,每只樹上有 {2,number} 只猴子");
echo $fmt->format([4560, 123, 4560 / 123]), PHP_EOL;
// 4,560 只猴子在 123 顆樹上,每只樹上有 37.073 只猴子

$fmt = new MessageFormatter("de", "{0,number,integer} Affen auf {1,number,integer} Bäumen sind {2,number} Affen pro Baum");
echo $fmt->format([4560, 123, 4560 / 123]), PHP_EOL;
// 4.560 Affen auf 123 Bäumen sind 37,073 Affen pro Baum

echo MessageFormatter::formatMessage("zh_CN", "{0,number,integer} 只猴子在 {1,number,integer} 顆樹上,每只樹上有 {2,number} 只猴子", [4560, 123, 4560 / 123]), PHP_EOL;
// 4,560 只猴子在 123 顆樹上,每只樹上有 37.073 只猴子

echo MessageFormatter::formatMessage("de", "{0,number,integer} Affen auf {1,number,integer} Bäumen sind {2,number} Affen pro Baum", [4560, 123, 4560 / 123]), PHP_EOL;
// 4.560 Affen auf 123 Bäumen sind 37,073 Affen pro Baum

看到了嗎?類似于 PDO 里預編譯操作的占位符。在調(diào)用 format() 方法后,就可以讓這個方法里面的參數(shù)來替換占位符的內(nèi)容。我們可以指定占位的所使用的參數(shù)類型和位置,{參數(shù)下標,類型,擴展類型} 這就是這個信息數(shù)據(jù)格式化的占位符的規(guī)則定義。看起來貌似很簡單呀,其實它還有更多的功能,我們將在后面看到。不過需要注意的是,它只支持數(shù)字、日期、文本片段類型,文章最后的參考鏈接中有官方的文檔可以查閱。

MessageFormatter::formatMessage() 這個靜態(tài)方法可以一次性地指定語言、預操作語句以及替換參數(shù),不需要先進行實例化再調(diào)用 format() 方法。

反格式化(根據(jù)規(guī)則獲取參數(shù)數(shù)組)

能夠進行格式化,當然我們也能夠根據(jù)語句規(guī)則來反格式化相關(guān)的字符串從而獲得對應占位符的參數(shù)列表。

// 根據(jù)格式化規(guī)則反向獲取規(guī)則參數(shù)
$fmt = new MessageFormatter('zh_CN', "{0,number,integer} 只猴子在 {1,number,integer} 顆樹上,每只樹上有 {2,number} 只猴子");
$res = $fmt->parse("4,560 只猴子在 123 樹上,每只樹上有 37.073 只猴子");
var_export($res); // false
echo "ERROR: " . $fmt->getErrorMessage() . " (" . $fmt->getErrorCode() . ")\n";
// ERROR: Parsing failed: U_MESSAGE_PARSE_ERROR (6)

$fmt = new MessageFormatter('en_US', "{0,number,integer} monkeys on {1,number,integer} trees make {2,number} monkeys per tree");
$res = $fmt->parse("4,560 monkeys on 123 trees make 37.073 monkeys per tree");
var_export($res);
// array (
//     0 => 4560,
//     1 => 123,
//     2 => 37.073,
//   )

$fmt = new MessageFormatter('de', "{0,number,integer} Affen auf {1,number,integer} Bäumen sind {2,number} Affen pro Baum");
$res = $fmt->parse("4.560 Affen auf 123 Bäumen sind 37,073 Affen pro Baum");
var_export($res);
// array (
//     0 => 4560,
//     1 => 123,
//     2 => 37.073,
//   )

$fmt = MessageFormatter::parseMessage('de', "{0,number,integer} Affen auf {1,number,integer} Bäumen sind {2,number} Affen pro Baum", "4.560 Affen auf 123 Bäumen sind 37,073 Affen pro Baum");
var_export($fmt);
// array (
//     0 => 4560,
//     1 => 123,
//     2 => 37.073,
//   )

使用實例化后的 parse() 方法或者直接使用靜態(tài)方法 MessageFormatter::parseMessage() 就能夠?qū)崿F(xiàn)這樣的操作。需要注意的是,對于 zh_CN ,也就是中文語言區(qū)域設(shè)置來說,這個操作是會出問題的。通過 getErrorMessage() 和 getErrorCode() 就可以看到錯誤信息以及錯誤代碼,可以看到對于中文來說,直接返回的錯誤信息就是解析失敗。

設(shè)置獲取規(guī)則

在實例化的對象中,我們還可以動態(tài)地修改規(guī)則語句。

// 設(shè)置獲取規(guī)則
$fmt = new MessageFormatter("zh_CN", "{0, number} 猴子在 {1, number} 顆樹上");
echo "默認規(guī)則: '" . $fmt->getPattern(), PHP_EOL; // 默認規(guī)則: '{0, number} 猴子在 {1, number} 顆樹上'
echo "格式化結(jié)果:" . $fmt->format(array(123, 456)), PHP_EOL; // 格式化結(jié)果:123 猴子在 456 顆樹上

$fmt->setPattern("{0, number} 顆樹上有 {1, number} 猴子");
echo "新規(guī)則: '" . $fmt->getPattern(), PHP_EOL; // 新規(guī)則: '{0, number} 顆樹上有 {1, number} 猴子'
echo "新規(guī)則格式化結(jié)果: " . $fmt->format(array(123, 456)), PHP_EOL; // 新規(guī)則格式化結(jié)果:123 顆樹上有 456 猴子

非常簡單的兩個方法,setPattern() 用于設(shè)置當前實例化對應的格式化規(guī)則,getPattern() 用于獲取查看當前實例化對象的格式化規(guī)則。在設(shè)置了新規(guī)則之后,進行 format() 或者 parse() 時就是按照新的規(guī)則語句來執(zhí)行的了。

格式化完整示例

上面說過,除了數(shù)字之外,還可以有日期格式的占位符,我們就來演示一下。

echo MessageFormatter::formatMessage('zh_CN', '今天是 {3, date, full},當前時間為 {3, time, ::Hms}, 我要準備開始 {0} 了,今天要和 {2,number,integer} 人見面,還不能忘了要交 {1,number,currency} 元的電費', ['上班', 35.33, 25, new DateTime()]), PHP_EOL;
// 今天是 2020年11月16日星期一,當前時間為 10:09:30, 我要準備開始 上班 了,今天要和 25 人見面,還不能忘了要交 ¥35.33 元的電費

在這段語句中,我們給定的參數(shù)順序并不是按照語句中占位符出現(xiàn)的順序,這樣并沒有影響,只需要指定對應位置的參數(shù)數(shù)組下標即可,比如第一個 {3, date, full} 指定的就是參數(shù)數(shù)組中的第4個元素(從0開始)。date 類型、time 類型都是可以指定的類型,當然我們也可以指定它們的 日期格式 比如第二個占位符我們就只顯示當前的時分秒信息。

如果是字符串信息,那么只需要一個簡單的 {0} 就可以了,字符串不需要太多的類型設(shè)置。而數(shù)字類型則可以直接格式化為貨幣等類型,就像我們之前講過的 NumberFormatter 中可以指定的那些類型一樣。

看完這一個示例是不是就感覺到這個 MessageFormatter 的強大之處了?別急,它還有更牛X的能力。

根據(jù)參數(shù)內(nèi)容進行復數(shù)顯示

對于復數(shù)來說,其實中文語法中并沒有這樣的語句,比如說一只貓是 a cat ,兩只貓是 two cats 。

echo MessageFormatter::formatMessage('en_US', 'I Have {0, plural, =0{no cat} =1{a cat} other{# cats}}', [0]),PHP_EOL; // I Have no cat
echo MessageFormatter::formatMessage('en_US', 'I Have {0, plural, =0{no cat} =1{a cat} other{# cats}}', [1]),PHP_EOL; // I Have a cat
echo MessageFormatter::formatMessage('en_US', 'I Have {0, plural, =0{no cat} =1{a cat} other{# cats}}', [2]),PHP_EOL; // I Have 2 cats

雖說參數(shù)類型的 plural 是復數(shù)的意思,不過其實我們可以將它看做是一個 switch() 語句的用法。

echo MessageFormatter::formatMessage('zh_CN', '我{0, plural, =0{沒有貓} other{有 # 只貓}}', [0]),PHP_EOL; // 我沒有貓
echo MessageFormatter::formatMessage('zh_CN', '我{0, plural, =0{沒有貓} other{有 # 只貓}}', [1]),PHP_EOL; // 我有 1 只貓
echo MessageFormatter::formatMessage('zh_CN', '我{0, plural, =0{沒有貓} other{有 # 只貓}}', [2]),PHP_EOL; // 我有 2 只貓

# 號就是對應的參數(shù)值的原內(nèi)容,這一套語法又讓這個 MessageFormatter 類上了一個層次吧,還有呢!我們先來看看這個問題:

echo MessageFormatter::formatMessage('en_US', 'I Have {0, plural, =0{no cat} =1{a cat} other{# cats}}', [-1]),PHP_EOL; // I Have -1 cats

參數(shù)傳錯了,-1 只貓可不對吧,沒關(guān)系,還有別的處理方式解決這個問題。

選擇條件規(guī)則

// 選擇表達式
echo MessageFormatter::formatMessage('en_US', 'I Have {0, choice, 0 #no cats| 1 #one cat | 2 #{0, number} cats}', [-1]),PHP_EOL; // I Have no cats
echo MessageFormatter::formatMessage('en_US', 'I Have {0, choice, 0 #no cats| 1 #one cat | 2 #{0, number} cats}', [0]),PHP_EOL; // I Have no cats
echo MessageFormatter::formatMessage('en_US', 'I Have {0, choice, 0 #no cats| 1 #one cat | 2 #{0, number} cats}', [1]),PHP_EOL; // I Have one cat
echo MessageFormatter::formatMessage('en_US', 'I Have {0, choice, 0 #no cats| 1 #one cat | 2 #{0, number} cats}', [2]),PHP_EOL; // I Have 2 cats
echo MessageFormatter::formatMessage('en_US', 'I Have {0, choice, 0 #no cats| 1 #one cat | 2 #{0, number} cats}', [10]),PHP_EOL; // I Have 10 cats

choice 這個單詞就能看出來,這是一個選擇相關(guān)的語法。后面的參數(shù)其實是一個區(qū)間,分別代表 <= 0 | 1 | >=2 的范圍內(nèi)使用哪個內(nèi)容。另外,一個占位符規(guī)則里面還可以繼續(xù)套占位符號的。

總結(jié)

又大開了一回眼界。文章開頭的兩部分內(nèi)容其實并沒有什么驚喜的地方,畢竟普通的字符串替換都能辦到,不過越往后面可是越來越精彩啊。當然,它的相關(guān)規(guī)則語法應該還有更多,只是這些資料非常少,不管是 PHP 官方文檔還是 ICU 的官方文檔都沒有找到過多的介紹。所以我們還是報以學習了解的態(tài)度先知道有這么回事,將來發(fā)現(xiàn)更有趣的資料后再來分享學習吧,也希望有使用過的朋友留言一起討論哦!

到此這篇關(guān)于PHP中信息格式化操作的文章就介紹到這了,更多相關(guān)PHP中信息格式化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

測試代碼:

github.com/zhangyue050

參考文檔:

www.php.net/manual/zh/c

userguide.icu-project.org/formatparse

相關(guān)文章

  • 遞歸實現(xiàn)php數(shù)組轉(zhuǎn)xml的代碼分享

    遞歸實現(xiàn)php數(shù)組轉(zhuǎn)xml的代碼分享

    本文以實例形式講述了PHP實現(xiàn)數(shù)組遞歸轉(zhuǎn)義的方法,分享給大家供大家參考之用。具體方法如下:
    2015-05-05
  • php通過exif_read_data函數(shù)獲取圖片的exif信息

    php通過exif_read_data函數(shù)獲取圖片的exif信息

    這篇文章主要介紹了php通過exif_read_data函數(shù)獲取圖片的exif信息,默認情況下,PHP讀取圖片Exif信息模塊是不開啟的,我們需要先開啟這個模塊。開啟Exif模塊需要mbstring支持,這里就不詳細說明了,我們來先看下函數(shù)的用法
    2015-05-05
  • PHP 中文簡繁互轉(zhuǎn)代碼 完美支持大陸、香港、臺灣及新加坡

    PHP 中文簡繁互轉(zhuǎn)代碼 完美支持大陸、香港、臺灣及新加坡

    利用MediaWiki 作中文簡繁互換,支持不同地方中文用字上的分別(大陸、香港、臺灣及新加坡)。
    2010-03-03
  • Laravel中間件的使用詳解

    Laravel中間件的使用詳解

    Laravel?中間件提供了一種方便的機制來過濾進入應用的?HTTP?請求。這篇文章主要和大家介紹一下Laravel中間件的創(chuàng)建和使用,需要的可以參考一下
    2023-02-02
  • PHP實現(xiàn)的AES 128位加密算法示例

    PHP實現(xiàn)的AES 128位加密算法示例

    這篇文章主要介紹了PHP實現(xiàn)的AES 128位加密算法,結(jié)合實例形式分析了AES 128位加密的相關(guān)概念、原理及php實現(xiàn)AES 128位加密的相關(guān)操作技巧,注釋中包含詳細的說明信息,需要的朋友可以參考下
    2019-09-09
  • 站長助手-網(wǎng)站web在線管理程序 v1.0 下載

    站長助手-網(wǎng)站web在線管理程序 v1.0 下載

    站長助手-網(wǎng)站web在線管理程序 v1.0 下載...
    2007-05-05
  • php實現(xiàn)的微信紅包算法分析(非官方)

    php實現(xiàn)的微信紅包算法分析(非官方)

    這篇文章主要介紹了php實現(xiàn)的微信紅包算法,以實例形式分析了拼手氣紅包的相關(guān)隨機算法技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • 從wamp到xampp的升級之路

    從wamp到xampp的升級之路

    這篇文章主要介紹了從wamp到xampp的升級之路的相關(guān)資料,十分的詳細,需要的朋友可以參考下
    2015-04-04
  • PHP異常處理Exception類

    PHP異常處理Exception類

    什么是異常? PHP 5 提供了一種新的面向?qū)ο蟮腻e誤處理方法。 異常處理用于在指定的錯誤(異常)情況發(fā)生時改變腳本的正常流程,感興趣的小伙伴們可以參考一下
    2015-12-12
  • php實現(xiàn)JWT驗證的實例教程

    php實現(xiàn)JWT驗證的實例教程

    這篇文章主要給大家介紹了關(guān)于php實現(xiàn)JWT驗證的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11

最新評論