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

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

本文主要介绍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…

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