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

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:28日期:2022-09-06 16:56:00
目錄前言格式化反格式化(根據規則獲取參數數組)設置獲取規則格式化完整示例根據參數內容進行復數顯示選擇條件規則總結前言

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

MessageFormatter 也是遵循的 ICU 規范,底層是 C 中的 ICU 操作,所以和 C 相關代碼的使用方式沒有太大的區別。

格式化

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

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

反格式化(根據規則獲取參數數組)

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

// 根據格式化規則反向獲取規則參數$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() 方法或者直接使用靜態方法 MessageFormatter::parseMessage() 就能夠實現這樣的操作。需要注意的是,對于 zh_CN ,也就是中文語言區域設置來說,這個操作是會出問題的。通過 getErrorMessage() 和 getErrorCode() 就可以看到錯誤信息以及錯誤代碼,可以看到對于中文來說,直接返回的錯誤信息就是解析失敗。

設置獲取規則

在實例化的對象中,我們還可以動態地修改規則語句。

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

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

格式化完整示例

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

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 元的電費

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

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

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

根據參數內容進行復數顯示

對于復數來說,其實中文語法中并沒有這樣的語句,比如說一只貓是 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

雖說參數類型的 plural 是復數的意思,不過其實我們可以將它看做是一個 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 只貓

# 號就是對應的參數值的原內容,這一套語法又讓這個 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

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

選擇條件規則

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

總結

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

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

測試代碼:

github.com/zhangyue050…

參考文檔:

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

userguide.icu-project.org/formatparse…

標簽: PHP
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
青草国产精品| 欧美精品aa| 久久精品99久久无色码中文字幕| 日韩午夜av在线| 精品久久久久中文字幕小说| 日韩一区中文| 先锋亚洲精品| 日韩成人精品一区| 综合在线一区| 久久亚洲国产精品一区二区| 久久亚洲专区| 亚洲综合在线电影| 欧美一区久久| 91精品国产一区二区在线观看| 中国女人久久久| 欧美色图一区| 日韩国产网站| 久久亚洲国产| 亚洲二区视频| 日本在线观看不卡视频| 国产精品chinese| 久久天堂成人| 中文一区一区三区免费在线观 | 水野朝阳av一区二区三区| 亚洲激精日韩激精欧美精品| 亚洲精品观看| 日韩电影免费网址| 午夜亚洲一区| 久久精品二区亚洲w码| 九九综合在线| 国产精品视频一区二区三区综合| 久久久久伊人| 日韩亚洲在线| 国产一区丝袜| 综合亚洲色图| 成人自拍av| 国产黄色一区| 四虎精品一区二区免费| 成人欧美一区二区三区的电影| 巨乳诱惑日韩免费av| 亚洲永久av| 免费日韩一区二区三区| 亚洲国产不卡| 亚洲午夜天堂| 国产欧美一区二区色老头| 欧美日韩在线二区| 精品日韩一区| 欧美一级全黄| 免费国产亚洲视频| 久草免费在线视频| 国产极品嫩模在线观看91精品| 欧美日韩国产在线观看网站| 国产精品免费精品自在线观看| 国产综合婷婷| 日韩一区电影| 国产成人精品一区二区免费看京 | 国产欧美精品| 日韩欧美2区| 麻豆久久精品| 亚洲欧美网站| 99久久精品费精品国产| 日韩欧美一区二区三区免费观看| 国精品产品一区| 麻豆国产精品视频| 麻豆mv在线观看| 亚洲v在线看| 激情五月色综合国产精品| 视频福利一区| 在线一区免费| 亚洲精品激情| 国产日韩亚洲欧美精品| 国产欧美日韩亚洲一区二区三区| 91九色综合| 麻豆成人91精品二区三区| 成人国产精品久久| sm久久捆绑调教精品一区| 电影91久久久| 亚洲一级高清| 日韩高清中文字幕一区| 国产美女视频一区二区| 精品国产18久久久久久二百| 四虎4545www国产精品| 国产精品美女久久久浪潮软件| 日本伊人久久| 鲁鲁在线中文| 视频精品一区二区| 国产精成人品2018| 日韩视频在线一区二区三区| 精品免费av| 久久91视频| 国产丝袜一区| 欧美丝袜一区| 亚洲精品视频一二三区| 国产精品s色| 欧美福利一区| 欧美激情aⅴ一区二区三区| 欧美成人a交片免费看| 综合一区av| 九九在线精品| zzzwww在线看片免费| 亚洲香蕉视频| 91精品亚洲| 麻豆高清免费国产一区| 亚洲一区国产一区| 精品三级国产| 婷婷综合电影| 欧美专区18| 国产一区视频在线观看免费| 国产精品毛片久久久| 亚洲精品亚洲人成在线观看| 欧美特黄一级大片| 日韩精品诱惑一区?区三区| 国产精品一站二站| 日韩激情啪啪| 亚洲人成毛片在线播放女女| 精品一区在线| 欧美jjzz| 伊人久久成人| 午夜久久久久| 国产农村妇女精品一二区| 国产毛片精品久久| 亚洲精品国模| 色综合视频一区二区三区日韩| 亚洲一区二区三区高清| 久久精品国产大片免费观看| 国产精品99一区二区三区| 久久av电影| 国产一区二区三区黄网站 | 美日韩一区二区三区| 蜜芽一区二区三区| 亚洲一区二区动漫| 欧美精品一区二区三区精品| 久久久久国产| 好看的av在线不卡观看| 黄色亚洲大片免费在线观看| 日韩视频一区二区三区在线播放免费观看| 日韩免费在线| 亚洲综合三区| 国产情侣久久| 粉嫩av一区二区三区四区五区 | 午夜一区在线| 日本综合精品一区| 国产欧美高清视频在线| 精品国产一区二区三区2021| 国产一区三区在线播放| 99精品国产一区二区三区| 亚洲免费黄色| 国产精品igao视频网网址不卡日韩 | 国产综合亚洲精品一区二| 国产模特精品视频久久久久| 亚洲欧洲美洲国产香蕉| 久久久久九九精品影院| 久久国产精品成人免费观看的软件| av亚洲免费| 国产精品日韩精品在线播放| 在线天堂中文资源最新版| 偷拍欧美精品| 美女av一区| 噜噜噜躁狠狠躁狠狠精品视频| 日韩av不卡在线观看| 97欧美在线视频| 在线精品亚洲| 日韩在线中文| 欧美亚洲三级| 日韩午夜av| 国产白浆在线免费观看| 日韩激情av在线| 99成人超碰| 国产一区一一区高清不卡| 日韩精品福利一区二区三区| 九九精品调教| 国产一区日韩| 国产免费播放一区二区| 国产精品婷婷| 亚洲精品成人图区| 国产欧美亚洲精品a| 欧美日韩国产探花| 亚洲精品在线影院| 丰满少妇一区| 老司机精品视频网| 日韩一区二区三区四区五区| 狠狠色狠狠色综合日日tαg| 日韩欧美三级| 黄色网一区二区| 久久精品女人| 精品入口麻豆88视频| 欧美激情99| 麻豆91精品视频| 欧美经典一区| 久久久久97| 国产欧美日韩一区二区三区四区 | 精品女同一区二区三区在线观看| 亚洲人亚洲人色久| 亚洲毛片在线| 日韩1区2区日韩1区2区| 91精品丝袜国产高跟在线| 日韩av电影一区| 久久国产精品免费一区二区三区| 亚洲精品福利| 国产免费播放一区二区|