您好,登錄后才能下訂單哦!
這篇文章主要介紹“PHP中信息格式化操作的方法”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“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 里預編譯操作的占位符。在調用 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() . ") "; // 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中信息格式化操作的方法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。