PHP中信息格式化操作详解(MessageFormatter类)

这篇文章主要给大家介绍了关于PHP中信息格式化操作的相关资料,主要运用的是专门用于信息格式化的MessageFormatter类,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

前言

在国际化组件的学习过程中,我们已经接触过了 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 元的电费 

在这段语句中,我们给定的参数顺序并不是按照语句中占位符出现的顺序,这样并没有影响,只需要

以上就是PHP中信息格式化操作详解(MessageFormatter类)的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » PHP编程