本文主要介绍PHP中信息格式化操作的相关信息,主要使用专门用于信息格式化的MessageFormatter类。通过示例代码介绍的非常详细,有需要的朋友可以参考一下。
目录
前言格式化取消格式化(根据规则获取参数数组)设置获取规则格式化完整示例根据参数内容显示复数。
选择条件规则
摘要
前言
在学习国际组件的过程中,我们接触到了NumberFormatter,它允许我们将数字转换成标准格式、货币、本地语言和其他形式。今天,我们将学习另一种专门用于信息格式化的MessageFormatter。它主要用于字符串操作。
MessageFormatter也遵循ICU规范,底层是C中的ICU操作,所以和C相关代码的使用区别不大。
格式化
//格式
$ fmt=newmessageformatter( zh _ cn , {0,number,integer}只猴子在{1,number,integer}树上,每棵树有{2,number}只猴子);
echo $fmt-format([4560,123,4560/123]),PHP _ EOL
//4560只猴子在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阿尔巴尼亚法郎123文莱元37,073阿尔巴尼亚法郎
消息回显格式化程序:格式化消息( zh _ cn , {1,number,integer}树上的{0,number,integer}只猴子,每棵树有{2,number}只猴子,[4560,123,4560/123]),PHP _
//4560只猴子在123棵树里,每棵树有37.073只猴子。
echo message formatter:format message( 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阿尔巴尼亚法郎123文莱元37,073阿尔巴尼亚法郎
看到了吗?占位符类似于PDO的预编译操作。调用format()方法后,可以让该方法中的参数替换占位符内容。我们可以指定占位符使用的参数的类型和位置,{参数下标,类型,扩展类型}这是该占位符的规则定义,用于信息数据格式化。看似简单,但功能更多,我们后面会看到。但需要注意的是,它只支持数字、日期和文本片段类型,文末的参考链接中有官方文档。
message formatter:format message()这个静态方法可以一次指定语言、前置操作语句和替换参数,不需要在调用format()方法之前进行实例化。
取消格式化(根据规则获取参数数组)
它可以被格式化。当然,我们也可以根据语句规则将相关字符串重新格式化,得到相应占位符的参数列表。
//根据格式化规则反向获取规则参数
$ fmt=newmessageformatter( zh _ cn , {0,number,integer}猴子在{1,number,integer}树上,每棵树有{2,number}只猴子);
$ RES=$ fmt-parse( 123棵树上有4560只猴子,每棵树上有37.073只猴子);
var _ export($ RES);//假
“回显”错误:“”。$fmt-getErrorMessage()。 ( .$fmt-getErrorCode()。) n ;
//错误:解析失败:U_MESSAGE_PARSE_ERROR (6)
$ fmt=new message formatter( en _ US , {1,number,integer}树上的{0,number,integer}只猴子使每棵树有{2,number}只猴子);
$ RES=$ fmt-parse( 123棵树上的4560只猴子,每棵树上有37.073只猴子);
var _ export($ RES);
//数组(
//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);
//数组(
//0=4560,
//1=123,
//2=37.073,
//)
$ fmt=message formatter:parse message( 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,073 Affen pro Baum );
var _ export($ fmt);
//数组(
//0=4560,
//1=123,
//2=37.073,
//)
可以通过使用实例化的parse()方法或直接使用静态方法MessageFormatter:parseMessage()来实现这一点。需要注意的是,对于zh_CN,也就是中文语言环境,这个操作会产生问题。可以通过getErrorMessage()和getErrorCode()查看错误信息和错误代码。可见,对于中文来说,直接返回的错误信息是解析失败。
获取规则
在实例化的对象中,我们还可以动态修改规则语句。
//设置采集规则
$ fmt=新消息格式化程序( zh _ cn , {1,number}棵树中的{0,number}只猴子);
“回显”默认规则:“”。$fmt-getPattern(),PHP _ EOL//默认规则:“{0,number}只猴子在{1,number}棵树中”
“回显”格式化结果:“”。$ fmt-format (array (123,456)),php _ eol//格式结果:456棵树上的123只猴子
$ fmt-set pattern(“{ 0,number}棵树有{1,number}只猴子”);
“回显”新规则:“”。$fmt-getPattern(),PHP _ EOL//新规则:“{0,number}棵树有{1,number}只猴子”
“回显”新规则格式结果:“”。$ fmt-format (array (123,456)),php _ eol//新规则格式化结果:123棵树中的456只猴子
两个非常简单的方法,setPattern()用于设置当前实例化对应的格式化规则,getPattern()用于获取查看当前实例化对象的格式化规则。设置新规则后,根据新规则语句执行format()或parse()。
完整的格式示例
如上所述,除了数字之外,还可以有日期格式的占位符。我们来演示一下。
消息回显格式化程序:格式化消息( zh _ cn ,今天是{3,date,full},当前时间是{3,time,Hms}。我将开始{0}。今天要去见{2,number,integer}人,不能忘了交{1,1}。币}元电费,[上班,35.33,25,新datetime ()]),PHP _ eol
//今天是2020年11月16日星期一。现在的时间是10:09:30。我要准备开始工作了。今天要见25个人,还忘不了交35.33元的电费。
在这个语句中,我们给出的参数顺序不是占位符在语句中出现的顺序,所以没有影响。我们只需要在相应的位置指定参数数组的索引。例如,第一个{3,date,full}指定参数数组中的第四个元素(从0开始)。日期类型和时间类型都是可以指定的类型。当然,我们也可以指定它们的日期格式。例如,在第二个占位符中,我们将只显示当前的分和秒信息。
如果是字符串信息,只需要简单的{0},字符串不需要太多的类型设置。数字类型可以直接格式化为货币和其他类型,就像我们前面谈到的可以在NumberFormatter中指定的那些类型一样。
看完这个例子,你感受到这个MessageFormatter的强大了吗?别担心,它有能力更牛逼。
根据参数内容。
对于复数,汉语语法里其实没有这样的说法。比如一只猫是猫,两只猫是两只猫。
echo message formatter:format message( en _ US , I有{0,复数,=0{no cat}=1{a cat} other{# cats}} ,[0]),PHP _ EOL//我没有猫
echo message formatter:format message( en _ US , I有{0,复数,=0{no cat}=1{a cat} other{# cats}} ,[1]),PHP _ EOL//我有一只猫
echo message formatter:format message( en _ US , I有{0,复数,=0{no cat}=1{a cat} other{# cats}} ,[2]),PHP _ EOL//我有两只猫
虽然parameter type的复数就是复数的意思,但我们其实可以把它看成是switch()语句的用法。
消息回显格式化程序:Format Message (zh _ cn , I {0,复数,=0{ no cat} other{有# cats }} ,[0]),PHP _ EOL//我没有猫
消息回显格式化程序:Format Message (zh _ cn , I {0,复数,=0{ no cat} other{有# cats }} ,[1]),PHP _ EOL//我有一只猫。
消息回显格式化程序:Format Message (zh _ cn , I {0,复数,=0{ no cat} other{有# cats }} ,[2]),PHP _ EOL//我有两只猫。
数字#是对应参数值的原始内容,这组语法将这个MessageFormatter类提升到了一个更高的层次。还有什么!我们先来看看这个问题:
echo message formatter:format message( en _ US , I有{0,复数,=0{no cat}=1{a cat} other{# cats}} ,[-1]),PHP _ EOL//我有-1只猫
错误的参数。一只猫是错的,对吗?没关系。还有其他方法可以解决这个问题。
选择条件规则
//选择表达式
echo message formatter:format message( en _ US ,我有{0,choice,0 #没有猫| 1 #一只猫| 2 #{0,number}只猫} ,[-1]),PHP _ EOL//我没有猫
echo message formatter:format message( en _ US ,我有{0,choice,0 #没有猫| 1 #一只猫| 2 #{0,number}只猫} ,[0]),PHP _ EOL//我没有猫
echo message formatter:format message( en _ US ,我有{0,choice,0 #没有猫| 1 #一只猫| 2 #{0,number}只猫} ,[1]),PHP _ EOL//我有一只猫
echo message formatter:format message( en _ US ,我有{0,choice,0 #没有猫| 1 #一只猫| 2 #{0,number}只猫} ,[2]),PHP _ EOL//我有两只猫
echo message formatter:format message( en _ US ,我有{0,choice,0 #没有猫| 1 #一只猫| 2 #{0,number}只猫} ,[10]),PHP _ EOL//我有10只猫
你可以通过单词choice来判断,这是一个与选择相关的语法。后一个参数实际上是一个区间,表示在=0 | 1 |=2的范围内使用哪些内容。此外,您可以继续在占位符规则中设置占位符。
摘要
它又让我开了眼界。其实文章的前两部分并没有什么惊喜。毕竟普通的字符串替换也可以,只是越往后面走越精彩。当然相关的规则和语法应该更多,但是这些资料非常少,无论是PHP官方文档还是ICU官方文档都没有找到太多的介绍。所以,我们最好抱着学习和理解的态度去了解一下,以后发现更多有趣的信息再来分享我们的学习。也希望有用过的朋友留言和我们一起探讨!
这就是这篇关于PHP中信息格式化的文章。关于PHP格式的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!
测试代码:
github.com/zhangyue050…
参考文件:
www.php.net/manual/zh/c…
userguide.icu-project.org/formatparse…