返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP中的信息格式化操作有什么用
  • 901
分享到

PHP中的信息格式化操作有什么用

2023-06-20 13:06:22 901人浏览 薄情痞子
摘要

这篇文章主要讲解了“PHP中的信息格式化操作有什么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php中的信息格式化操作有什么用”吧!在国际化组件的学习过程中,我们已经接触过了Number

这篇文章主要讲解了“PHP中的信息格式化操作有什么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php中的信息格式化操作有什么用”吧!

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

在这段语句中,我们给定的参数顺序并不是按照语句中占位符出现的顺序,这样并没有影响,只需要指定对应位置的参数数组下标即可,比如第一个 {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 catecho MessageFormatter::formatMessage('en_US', 'I Have {0, plural, =0{no cat} =1{a cat} other{# cats}}', [1]),PHP_EOL; // I Have a catecho 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 catsecho MessageFormatter::formatMessage('en_US', 'I Have {0, choice, 0 #no cats| 1 #one cat | 2 #{0, number} cats}', [0]),PHP_EOL; // I Have no catsecho MessageFormatter::formatMessage('en_US', 'I Have {0, choice, 0 #no cats| 1 #one cat | 2 #{0, number} cats}', [1]),PHP_EOL; // I Have one catecho MessageFormatter::formatMessage('en_US', 'I Have {0, choice, 0 #no cats| 1 #one cat | 2 #{0, number} cats}', [2]),PHP_EOL; // I Have 2 catsecho 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 官方文档还是 ICU 的官方文档都没有找到过多的介绍。所以我们还是报以学习了解的态度先知道有这么回事,将来发现更有趣的资料后再来分享学习吧,也希望有使用过的朋友留言一起讨论哦!

感谢各位的阅读,以上就是“PHP中的信息格式化操作有什么用”的内容了,经过本文的学习后,相信大家对PHP中的信息格式化操作有什么用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: PHP中的信息格式化操作有什么用

本文链接: https://lsjlt.com/news/296946.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • PHP中的信息格式化操作有什么用
    这篇文章主要讲解了“PHP中的信息格式化操作有什么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP中的信息格式化操作有什么用”吧!在国际化组件的学习过程中,我们已经接触过了Number...
    99+
    2023-06-20
  • PHP中信息格式化操作的方法
    这篇文章主要介绍“PHP中信息格式化操作的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“PHP中信息格式化操作的方法”文章能帮助大家解决问题。格式化//&nbs...
    99+
    2024-04-02
  • PHP中信息格式化操作详解(MessageFormatter类)
    目录前言格式化反格式化(根据规则获取参数数组)设置获取规则格式化完整示例根据参数内容进行复数显示选择条件规则总结前言 在国际化组件的学习过程中,我们已经接触过了 NumberForm...
    99+
    2024-04-02
  • Windows中格式化与快速格式化的区别有什么
    今天就跟大家聊聊有关Windows中格式化与快速格式化的区别有什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。顾名思义,从字面上就能知道快速格式化的速度要快于格式化的速度! 他们还...
    99+
    2023-06-14
  • PHP中怎么操作区域语言标记信息
    小编给大家分享一下PHP中怎么操作区域语言标记信息,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!相信大家对zh_CN这个东西绝对不会陌生,不管是PHP中,还是在我...
    99+
    2023-06-20
  • 电脑c盘格式化操作方法是什么
    本文小编为大家详细介绍“电脑c盘格式化操作方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“电脑c盘格式化操作方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。电脑c盘格式化操作方法:首先打开电脑,...
    99+
    2023-07-01
  • U盘写保护格式化不上怎么操作?有写保护的u盘怎么格式化?
    有一些小伙伴应用U盘的情况下发觉U盘被写保护了,哪些文档都储存不进去,要想格式化也不好,这类状况需要怎么办呢?今日系统之家我来跟大伙说说U盘写保护怎么格式化,方式有很多,能够逐一试着一遍看一下,期待可以协助到大伙儿。U盘写保护格式化不上怎么...
    99+
    2023-07-18
  • PHP中针对区域语言标记信息的操作
    相信大家对 zh_CN 这个东西绝对不会陌生,不管是 PHP 中,还是在我们的网页上,都会见到它的身影。其实这就是指定我们的显示编码是什么国家或者地区的,使用何种语言。对于这种区域语...
    99+
    2024-04-02
  • php中var_dump没有格式化怎么解决
    这篇文章主要介绍了php中var_dump没有格式化怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇php中var_dump没有格式化怎么解决文章都会有所收获,下面我们一起来看看吧。方法:1、利用“php...
    99+
    2023-06-30
  • SQL-Hive中常用的表格操作是什么
    本篇内容主要讲解“SQL-Hive中常用的表格操作是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SQL-Hive中常用的表格操作是什么”吧!01-最基础的...
    99+
    2024-04-02
  • vscode使用Eslint+Prettier格式化代码的详细操作
    目录 step 1 step 2 step 3 step 4 step 5 最后效果 step 1 1、安装Eslint插件和Prettier插件 2、 安装eslint npm...
    99+
    2024-04-02
  • mongodb中oplog的格式和作用是什么
    这篇文章主要讲解了“mongodb中oplog的格式和作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mongodb中oplog的格式和作用是什么”吧!目录 基本概念 Oplog 的...
    99+
    2023-06-20
  • Springboot中全局时间格式化操作的示例分析
    这篇文章主要为大家展示了“Springboot中全局时间格式化操作的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Springboot中全局时间格式化操作的示例分析”这篇文章吧。时间格式...
    99+
    2023-06-15
  • php中eof有什么作用
    小编给大家分享一下php中eof有什么作用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!php eof的用法:首先创建一个PHP示例文件;然后通过“echo &l...
    99+
    2023-06-14
  • php中for有什么作用
    这篇文章主要讲解了“php中for有什么作用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php中for有什么作用”吧!php中for指的是PHP for循环语句,该语句可以循环执行代码块指...
    99+
    2023-06-25
  • php 中FastCGI模式的作用是什么
    php 中FastCGI模式的作用是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、说明是一种让交互程序与 Web 服务器通信的协议。FastCGI 是早期通用网关接...
    99+
    2023-06-15
  • php中cli模式的作用是什么
    在PHP中,CLI(Command Line Interface)模式是指通过命令行界面执行PHP脚本的模式。CLI模式有以下作用:...
    99+
    2024-03-01
    php
  • Python格式化字符串在实际操作过程中的使用方法
    这篇文章主要讲解了“Python格式化字符串在实际操作过程中的使用方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python格式化字符串在实际操作过程中的使用方法”吧!Python格式化...
    99+
    2023-06-17
  • Dreamweaver文件头部信息的作用是什么
    这篇文章主要介绍Dreamweaver文件头部信息的作用是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Dreamweaver中的网页有两个组成部分,一个是<head></head>,一个...
    99+
    2023-06-08
  • PHP正则表达式有什么作用
    这篇文章给大家分享的是有关PHP正则表达式有什么作用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。PHP被大量的应用于Web的后台CGI开发,通常是在用户数据数据之后得出某种结果,但是如果用户输入的数据不正确,就...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作