日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

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

在國際化組件的學(xué)習(xí)過程中,我們已經(jīng)接觸過了 NumberFormatter 這種數(shù)字的格式化操作,它可以讓我們將數(shù)字轉(zhuǎn)換成標(biāo)準(zhǔn)格式、貨幣、本地語言等形式。今天我們來學(xué)習(xí)的是另一種專門用于信息格式化的類 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 Baumecho 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 里預(yù)編譯操作的占位符。在調(diào)用 format() 方法后,就可以讓這個方法里面的參數(shù)來替換占位符的內(nèi)容。我們可以指定占位的所使用的參數(shù)類型和位置,{參數(shù)下標(biāo),類型,擴展類型} 這就是這個信息數(shù)據(jù)格式化的占位符的規(guī)則定義??雌饋砻菜坪芎唵窝?,其實它還有更多的功能,我們將在后面看到。不過需要注意的是,它只支持?jǐn)?shù)字、日期、文本片段類型,文章最后的參考鏈接中有官方的文檔可以查閱。

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

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

能夠進(jìn)行格式化,當(dāng)然我們也能夠根據(jù)語句規(guī)則來反格式化相關(guān)的字符串從而獲得對應(yīng)占位符的參數(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); // 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,// )

使用實例化后的 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 '默認(rèn)規(guī)則: ’' . $fmt->getPattern(), PHP_EOL; // 默認(rèn)規(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è)置當(dāng)前實例化對應(yīng)的格式化規(guī)則,getPattern() 用于獲取查看當(dāng)前實例化對象的格式化規(guī)則。在設(shè)置了新規(guī)則之后,進(jìn)行 format() 或者 parse() 時就是按照新的規(guī)則語句來執(zhí)行的了。

格式化完整示例

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

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

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

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

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

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

對于復(fù)數(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 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

雖說參數(shù)類型的 plural 是復(fù)數(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 只貓

# 號就是對應(yīng)的參數(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ī)則

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

總結(jié)

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

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

測試代碼:

github.com/zhangyue050…

參考文檔:

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

userguide.icu-project.org/formatparse…

標(biāo)簽: PHP
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久伊人国产| 欧美一区91| 伊人久久国产| 欧洲一级精品| 久久在线免费| 日韩亚洲在线| 中文字幕一区二区三区日韩精品| 亚洲综合二区| 色8久久久久| 日韩一区二区三免费高清在线观看 | 午夜精品免费| 中文欧美日韩| 亚洲网址在线观看| 91成人在线| 久久精品国产99国产| 超级白嫩亚洲国产第一| 久久高清免费| 天堂成人免费av电影一区| 亚洲精品第一| 激情综合婷婷| 激情欧美一区二区三区| 亚洲精品在线a| 美女视频网站久久| 久久久蜜桃一区二区人| 免费久久99精品国产自在现线| 综合干狼人综合首页| 国产精品a级| 日韩av首页| 亚洲一区av| 精品中文字幕一区二区三区四区| 日韩美女一区二区三区在线观看| 午夜在线播放视频欧美| 国产麻豆精品| 久久精品电影| 欧美另类中文字幕| 成人免费电影网址| 少妇高潮一区二区三区99| 国产极品一区| 欧美性感美女一区二区| 日本中文字幕一区二区视频| 乱一区二区av| 欧美在线资源| 国产精品一区免费在线| 日韩不卡视频在线观看| 日韩中文字幕不卡| 狠狠久久伊人| 蜜臀久久久久久久| 国产成人免费| 亚州精品视频| 亚洲不卡系列| 久久国产乱子精品免费女| 五月激情久久| 久久精品999| 亚洲男女av一区二区| 国产欧美日韩综合一区在线播放| 91中文字幕精品永久在线| 亚洲在线网站| 岛国av在线播放| 亚洲毛片在线免费| 久久久精品久久久久久96| 欧美视频精品全部免费观看| 成人精品天堂一区二区三区| 国产日本精品| 美女网站久久| av在线日韩| 国产精品亚洲欧美一级在线| 好看不卡的中文字幕| 国产精品夜夜夜| 麻豆精品网站| 久久精品动漫| 国产精品.xx视频.xxtv| 亚洲欧美不卡| 欧美成人基地 | 神马午夜久久| 国产麻豆一区二区三区| 妖精视频成人观看www| 色婷婷亚洲mv天堂mv在影片| 日本一区中文字幕| 亚洲性色av| 国产精品jk白丝蜜臀av小说| 日韩精品一级二级| 久久婷婷久久| 精品一区二区三区中文字幕视频 | 热久久国产精品| 日韩精品影视| 免费在线观看一区| 日本精品另类| 黄色日韩精品| 成人免费电影网址| 久久精品国产成人一区二区三区| 亚洲精品伊人| 视频一区二区三区中文字幕| 国产99久久| 成人在线视频免费看| 国产精品一页| 亚洲精品一二| 性色一区二区| 精品一区欧美| 91精品蜜臀一区二区三区在线| av中文字幕在线观看第一页| 久久伊人久久| 久久一区欧美| 国产精品主播| 欧美日韩一区自拍| 18国产精品| 91亚洲精品在看在线观看高清| 综合国产视频| 蜜臀av国产精品久久久久| 欧美福利一区| 偷拍欧美精品| 欧美搞黄网站| 欧美成人午夜| 黄色成人91| 国产毛片一区| 亚洲一区导航| 日韩精选在线| 91av一区| 国产精品久一| 国产精品亚洲片在线播放| 久久国产婷婷国产香蕉| 国产一精品一av一免费爽爽| 欧美日韩一区二区三区不卡视频| 日韩成人在线看| 欧美日韩精品一区二区三区视频| 日本色综合中文字幕| 久久激情av| 久久精品国产久精国产爱| 成人在线视频区| 日韩精品影视| 国产精品毛片在线| 亚洲精选久久| 欧美日一区二区在线观看| 国产精品亚洲二区| 国产探花在线精品| 久久天堂影院| 色婷婷狠狠五月综合天色拍| 不卡视频在线| 在线观看亚洲精品福利片| 日本久久一区| 精品亚洲自拍| 99久久99久久精品国产片果冰| 欧美午夜不卡| 日韩中文字幕| 欧美激情麻豆| 日韩欧美另类一区二区| 欧美日韩视频| 日韩激情网站| 国产一区二区亚洲| 欧美韩日一区| 欧美女激情福利| 日韩精品乱码av一区二区| 麻豆国产精品| 欧美va天堂在线| 视频精品一区| 精品国产中文字幕第一页| 久久国产亚洲精品| 中文无码久久精品| 欧美国产三级| 久久国产影院| 婷婷精品在线| 国产一区二区三区亚洲综合| 亚洲婷婷免费| 日韩精品中文字幕一区二区| 欧美另类中文字幕| 日韩久久电影| 亚洲欧美专区| 色综合狠狠操| 蜜桃av一区二区| 国产成人精品福利| 视频一区在线播放| 久久精品一区二区国产| 在线国产一区| 国产欧美日韩亚洲一区二区三区| 日韩一区电影| 亚洲aa在线| 日韩不卡视频在线观看| 亚洲精品国产精品粉嫩| 国产精品国产三级国产在线观看| 久久久久久久久久久9不雅视频| 蜜芽一区二区三区| 精品亚洲二区| 亚洲永久字幕| 精品国产美女a久久9999| 亚洲在线国产日韩欧美| 久久中文字幕一区二区| 国产视频一区三区| 麻豆精品视频在线观看| 在线午夜精品| 欧美激情另类| 亚洲精品乱码久久久久久蜜桃麻豆 | 日韩欧美午夜| 日韩不卡免费视频| 欧美日韩一二| 国产精品免费99久久久| 在线综合欧美| www.九色在线| 国产免费av一区二区三区| 99在线观看免费视频精品观看| 国产一区国产二区国产三区| 亚洲精品成a人ⅴ香蕉片|