溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP中信息格式化操作的方法

發(fā)布時(shí)間:2022-03-25 11:13:06 來源:億速云 閱讀:105 作者:iii 欄目:web開發(fā)

這篇文章主要介紹“PHP中信息格式化操作的方法”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“PHP中信息格式化操作的方法”文章能幫助大家解決問題。

格式化

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

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

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

能夠進(jìn)行格式化,當(dāng)然我們也能夠根據(jù)語句規(guī)則來反格式化相關(guān)的字符串從而獲得對(duì)應(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); // false
echo "ERROR: " . $fmt->getErrorMessage() . " (" . $fmt->getErrorCode() . ")
";
// 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 ,也就是中文語言區(qū)域設(shè)置來說,這個(gè)操作是會(huì)出問題的。通過 getErrorMessage() 和 getErrorCode() 就可以看到錯(cuò)誤信息以及錯(cuò)誤代碼,可以看到對(duì)于中文來說,直接返回的錯(cuò)誤信息就是解析失敗。

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

在實(shí)例化的對(duì)象中,我們還可以動(dòng)態(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 猴子

非常簡(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ī)則語句來執(zhí)行的了。

格式化完整示例

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

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

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

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

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

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

對(duì)于復(fù)數(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 是復(fù)數(shù)的意思,不過其實(shí)我們可以將它看做是一個(gè) 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 只貓

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

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ì)吧,沒關(guān)系,還有別的處理方式解決這個(gè)問題。

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

關(guān)于“PHP中信息格式化操作的方法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI