婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > PHP中信息格式化操作詳解(MessageFormatter類)

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

熱門標簽:溫州外呼系統招商 手機外呼系統什么原理 上海400客服電話怎么申請 400電話個人能不能辦理 合肥ai電銷機器人費用 天津電銷外呼系統違法嗎 銀行信貸電話機器人 凱立德地鐵站地圖標注 滄州電銷外呼系統價格

前言

在國際化組件的學習過程中,我們已經接觸過了 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 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 里預編譯操作的占位符。在調用 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); // 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() 方法或者直接使用靜態方法 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 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

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

總結

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

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

測試代碼:

github.com/zhangyue050…

參考文檔:

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

userguide.icu-project.org/formatparse…

您可能感興趣的文章:
  • PHP中常用的字符串格式化函數總結
  • 深入理解php printf() 輸出格式化的字符串
  • PHP vsprintf()函數格式化字符串操作原理解析
  • PHP數字格式化
  • PHP 防注入函數(格式化數據)
  • php格式化時間戳

標簽:金華 洛陽 赤峰 怒江 溫州 白城 七臺河 酒泉

巨人網絡通訊聲明:本文標題《PHP中信息格式化操作詳解(MessageFormatter類)》,本文關鍵詞  PHP,中,信息,格式化,操作,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP中信息格式化操作詳解(MessageFormatter類)》相關的同類信息!
  • 本頁收集關于PHP中信息格式化操作詳解(MessageFormatter類)的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    性久久久久久久| 欧美综合欧美视频| 美女视频网站久久| 欧美日韩国产区一| 欧美久久久久久久久| 色噜噜狠狠色综合欧洲selulu| 青椒成人免费视频| 欧美日韩一区中文字幕| 一区二区成人在线观看| 欧洲一区二区av| 亚洲香肠在线观看| 欧美日韩精品系列| 日韩高清一区二区| 久久久久久毛片| 国产欧美日韩在线观看| 韩国精品在线观看| 国产精品视频你懂的| 91香蕉视频mp4| 欧美丝袜第三区| 亚洲v日本v欧美v久久精品| 在线不卡的av| 麻豆91小视频| 色www精品视频在线观看| 亚洲另类在线视频| 6080国产精品一区二区| 国产精品午夜春色av| 国产拍揄自揄精品视频麻豆| 不卡在线视频中文字幕| 欧美体内she精高潮| 麻豆视频观看网址久久| 中文字幕 久热精品 视频在线| 夜夜嗨av一区二区三区| 欧美老肥妇做.爰bbww视频| 久久精品99国产精品| 精品一区二区三区av| 亚洲18女电影在线观看| 成人午夜av电影| 色婷婷精品久久二区二区蜜臀av| 色老头久久综合| 亚洲成人免费视| 国产盗摄视频一区二区三区| 中文字幕视频一区| 国产在线看一区| 一区二区三区免费| 精品国产91亚洲一区二区三区婷婷| 成人精品国产福利| 久久99精品久久久久婷婷| 国产精品国产精品国产专区不蜜 | 欧美视频一区二区三区四区 | 亚洲欧洲精品一区二区精品久久久| 亚洲精选免费视频| 国产高清精品久久久久| 亚洲电影一级黄| 国产精品二三区| 国产成人av影院| 日韩精品电影一区亚洲| 夜夜嗨av一区二区三区四季av| 国产精品天干天干在观线| 日本免费新一区视频| 亚洲欧美日本韩国| 国产精品久久久久7777按摩| 精品国产免费视频| 国产一区二区视频在线播放| 欧美中文字幕亚洲一区二区va在线 | 国产午夜精品福利| 欧美一区三区二区| 午夜久久久久久电影| 国产91清纯白嫩初高中在线观看| 91精品欧美综合在线观看最新 | 国产成人在线观看| 久久日韩精品一区二区五区| 日韩限制级电影在线观看| 欧美欧美欧美欧美首页| 捆绑变态av一区二区三区 | 亚洲综合一二三区| 亚洲欧美国产77777| 亚洲欧美福利一区二区| 亚洲伊人色欲综合网| 欧美三级乱人伦电影| 在线精品视频免费播放| 精东粉嫩av免费一区二区三区| 国产精品不卡在线| 亚洲男人的天堂在线观看| 国产精品一区一区三区| 国产一区二区三区四| 欧美日韩一级片网站| 欧美三级韩国三级日本三斤| 91精品国产欧美一区二区| 久久久国产精品午夜一区ai换脸| 国产精品一二三在| 国产精一品亚洲二区在线视频| 成人毛片视频在线观看| 欧美系列一区二区| 日韩欧美国产三级| 色婷婷av一区二区| 美女视频免费一区| 国产精品国产精品国产专区不片| 一区二区视频在线| 日日夜夜免费精品视频| 久久久久久久久久美女| 91麻豆自制传媒国产之光| 一区二区三国产精华液| 亚洲在线中文字幕| 精彩视频一区二区| 色天天综合色天天久久| 日韩你懂的在线播放| 亚洲另类色综合网站| 理论电影国产精品| 日韩国产欧美三级| 狠狠色伊人亚洲综合成人| 91在线视频网址| 91亚洲大成网污www| 奇米精品一区二区三区在线观看一| 国产乱码精品一区二区三区av| 欧美性色欧美a在线播放| 99精品偷自拍| 精品久久久久av影院| 欧美一区二区不卡视频| 中文字幕日韩精品一区| 日韩av一区二区在线影视| 色天天综合久久久久综合片| 国产色产综合色产在线视频| 欧美私人免费视频| 91在线无精精品入口| 91精品在线一区二区| 亚洲美女屁股眼交3| 不卡一区中文字幕| 久久伊人蜜桃av一区二区| 免费人成精品欧美精品| 亚洲成a人片在线观看中文| 国产丶欧美丶日本不卡视频| 日韩免费性生活视频播放| 亚洲高清视频中文字幕| 91在线视频网址| 亚洲自拍偷拍网站| 26uuu欧美日本| 婷婷夜色潮精品综合在线| 91麻豆产精品久久久久久| 国产精品免费观看视频| 国产伦精品一区二区三区免费迷| 精品粉嫩超白一线天av| 欧美视频第二页| 成人欧美一区二区三区1314| 国产精品进线69影院| 亚洲黄色小说网站| 国产呦萝稀缺另类资源| 欧美在线一二三四区| 亚洲精品国产精品乱码不99| 自拍偷拍欧美激情| 日韩av网站免费在线| 亚洲第一会所有码转帖| 91成人在线精品| 成人免费在线视频| 亚洲成va人在线观看| 老司机午夜精品| 天天综合天天做天天综合| 精品一区二区在线视频| 国产三区在线成人av| 精品国产区一区| 蜜桃av一区二区三区电影| 视频一区中文字幕国产| 在线免费观看不卡av| 亚洲国产欧美在线| 亚洲国产欧美日韩另类综合| 日本午夜一本久久久综合| 亚洲最新视频在线观看| 亚洲免费在线视频| 欧美绝品在线观看成人午夜影视| 日韩视频免费直播| 91在线观看地址| 国产一区二区三区免费| 国产成a人亚洲| 综合激情成人伊人| 国产成人av影院| 色老汉一区二区三区| 国产一区二区不卡| 视频一区二区欧美| 国产精品国产自产拍高清av王其| 国产精品99久久久| 欧美一区二区三区视频免费播放| 蜜桃av一区二区在线观看| 中文字幕不卡在线播放| 成人免费视频一区二区| 亚洲一区二区视频在线观看| 日韩欧美不卡在线观看视频| 国产精品另类一区| 麻豆精品在线看| 在线精品视频一区二区三四| 国内精品久久久久影院色| 久久久久久久久久久久久久久99| 色综合天天天天做夜夜夜夜做| 精品国产区一区| 色综合欧美在线视频区| 亚洲精品视频一区二区| 成人黄色综合网站| 蜜桃91丨九色丨蝌蚪91桃色| 欧美三级视频在线播放| av一本久道久久综合久久鬼色| 一区二区三区高清在线| 蜜桃一区二区三区四区|