亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

瀏覽:3日期:2022-09-06 16:56:00
目錄前言格式化反格式化(根據(jù)規(guī)則獲取參數(shù)數(shù)組)設(shè)置獲取規(guī)則格式化完整示例根據(jù)參數(shù)內(nèi)容進(jìn)行復(fù)數(shù)顯示選擇條件規(guī)則總結(jié)前言

在國(guó)際化組件的學(xué)習(xí)過(guò)程中,我們已經(jīng)接觸過(guò)了 NumberFormatter 這種數(shù)字的格式化操作,它可以讓我們將數(shù)字轉(zhuǎn)換成標(biāo)準(zhǔn)格式、貨幣、本地語(yǔ)言等形式。今天我們來(lái)學(xué)習(xí)的是另一種專(zhuān)門(mén)用于信息格式化的類(lèi) MessageFormatter ,它主要是針對(duì)字符串的操作。

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

格式化

// 格式化$fmt = new MessageFormatter('zh_CN', '{0,number,integer} 只猴子在 {1,number,integer} 顆樹(shù)上,每只樹(shù)上有 {2,number} 只猴子');echo $fmt->format([4560, 123, 4560 / 123]), PHP_EOL;// 4,560 只猴子在 123 顆樹(shù)上,每只樹(shù)上有 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 Baumecho MessageFormatter::formatMessage('zh_CN', '{0,number,integer} 只猴子在 {1,number,integer} 顆樹(shù)上,每只樹(shù)上有 {2,number} 只猴子', [4560, 123, 4560 / 123]), PHP_EOL;// 4,560 只猴子在 123 顆樹(shù)上,每只樹(shù)上有 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

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

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

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

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

// 根據(jù)格式化規(guī)則反向獲取規(guī)則參數(shù)$fmt = new MessageFormatter(’zh_CN’, '{0,number,integer} 只猴子在 {1,number,integer} 顆樹(shù)上,每只樹(shù)上有 {2,number} 只猴子');$res = $fmt->parse('4,560 只猴子在 123 樹(shù)上,每只樹(shù)上有 37.073 只猴子');var_export($res); // falseecho '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,// )

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

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

在實(shí)例化的對(duì)象中,我們還可以動(dòng)態(tài)地修改規(guī)則語(yǔ)句。

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

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

格式化完整示例

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

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

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

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

看完這一個(gè)示例是不是就感覺(jué)到這個(gè) MessageFormatter 的強(qiáng)大之處了?別急,它還有更牛X的能力。

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

對(duì)于復(fù)數(shù)來(lái)說(shuō),其實(shí)中文語(yǔ)法中并沒(méi)有這樣的語(yǔ)句,比如說(shuō)一只貓是 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 catecho MessageFormatter::formatMessage(’en_US’, ’I Have {0, plural, =0{no cat} =1{a cat} other{# cats}}’, [1]),PHP_EOL; // I Have a catecho MessageFormatter::formatMessage(’en_US’, ’I Have {0, plural, =0{no cat} =1{a cat} other{# cats}}’, [2]),PHP_EOL; // I Have 2 cats

雖說(shuō)參數(shù)類(lèi)型的 plural 是復(fù)數(shù)的意思,不過(guò)其實(shí)我們可以將它看做是一個(gè) switch() 語(yǔ)句的用法。

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

# 號(hào)就是對(duì)應(yīng)的參數(shù)值的原內(nèi)容,這一套語(yǔ)法又讓這個(gè) MessageFormatter 類(lèi)上了一個(gè)層次吧,還有呢!我們先來(lái)看看這個(gè)問(wèn)題:

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ù)傳錯(cuò)了,-1 只貓可不對(duì)吧,沒(méi)關(guān)系,還有別的處理方式解決這個(gè)問(wèn)題。

選擇條件規(guī)則

// 選擇表達(dá)式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 catsecho MessageFormatter::formatMessage(’en_US’, ’I Have {0, choice, 0 #no cats| 1 #one cat | 2 #{0, number} cats}’, [0]),PHP_EOL; // I Have no catsecho MessageFormatter::formatMessage(’en_US’, ’I Have {0, choice, 0 #no cats| 1 #one cat | 2 #{0, number} cats}’, [1]),PHP_EOL; // I Have one catecho MessageFormatter::formatMessage(’en_US’, ’I Have {0, choice, 0 #no cats| 1 #one cat | 2 #{0, number} cats}’, [2]),PHP_EOL; // I Have 2 catsecho 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 這個(gè)單詞就能看出來(lái),這是一個(gè)選擇相關(guān)的語(yǔ)法。后面的參數(shù)其實(shí)是一個(gè)區(qū)間,分別代表 <= 0 | 1 | >=2 的范圍內(nèi)使用哪個(gè)內(nèi)容。另外,一個(gè)占位符規(guī)則里面還可以繼續(xù)套占位符號(hào)的。

總結(jié)

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

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

測(cè)試代碼:

github.com/zhangyue050…

參考文檔:

www.php.net/manual/zh/c…

userguide.icu-project.org/formatparse…

標(biāo)簽: PHP
相關(guān)文章:
主站蜘蛛池模板: 性生活大片免费看 | 全部免费特别黄的视频播放 | 福利片在线观看免费高清视频 | 欧美成人爽毛片在线视频 | 久久三级国产 | 九九精品久久久久久久久 | 农村妇女色又黄一级毛片不卡 | 日韩欧美综合视频 | 亚洲国产剧情在线 | 日韩五级片 | 国产噜噜噜视频在线观看 | 黄色片视频国产 | 黄色网页免费看 | 色婷婷亚洲综合 | 国偷盗摄自产福利一区在线 | 国产无人区一区二区三区 | 韩国一级特黄清高免费大片 | 亚欧精品一区二区三区四区 | 成人午夜久久 | 三级黄色在线免费观看 | 久久精品国产一区二区三区不卡 | 国产乱偷国产偷高清 | 亚久久伊人精品青青草原2020 | 婷婷综合国产激情在线 | c看欧美激情毛片 | 亚洲无线一二三四区 | 成人影院www在线观看 | 欧美三级免费网站 | 欧美一级成人 | 欧美精品国产日韩综合在线 | 亚洲限制级 | 一个色综合亚洲色综合 | 91精品视频网站 | 特级毛片a级毛免费播放 | 国产精品久久久久久久久免费 | 亚洲午夜精品aaa级久久久久 | 欧美视频第一页 | www成人免费观看网站 | 免费黄色一级 | 国产精品久久久久久 | 高清欧美一区二区免费影视 |