Comment apprendre les opérations de formatage des informations en PHP

醉折花枝作酒筹
Libérer: 2023-03-11 07:54:01
avant
2285 Les gens l'ont consulté

Dans le processus d'apprentissage de la composante internationale, nous avons déjà été exposés à l'opération de formatage des nombres de NumberFormatter, qui nous permet de convertir des nombres en formats standards, devises, langues locales, etc. Aujourd'hui, nous allons découvrir une autre classe MessageFormatter spécialement utilisée pour le formatage des informations. Elle est principalement utilisée pour les opérations sur les chaînes.

Comment apprendre les opérations de formatage des informations en PHP

MessageFormatter suit également la spécification ICU. La couche inférieure est l'opération ICU en C, il n'y a donc pas beaucoup de différence dans l'utilisation du code lié au C.

Formatage

// 格式化
$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
Copier après la connexion

Vous voyez ? Semblable aux espaces réservés pour les opérations de précompilation dans PDO. Après avoir appelé la méthode format(), vous pouvez laisser les paramètres de cette méthode remplacer le contenu de l'espace réservé.

Nous pouvons spécifier le type de paramètre et la position utilisée par l'espace réservé, {parameter subscript, type, extend type}. Il s'agit de la définition de la règle de l'espace réservé pour ce formatage de données d'informations. Cela semble très simple, mais en fait il a plus de fonctions, que nous verrons plus tard.

Cependant, il convient de noter qu'il ne prend en charge que les types de nombres, de dates et de fragments de texte. Des documents officiels sont disponibles dans le lien de référence à la fin de l'article.

MessageFormatter::formatMessage() Cette méthode statique peut spécifier le langage, les instructions préparées et les paramètres de remplacement à la fois, sans avoir besoin d'instancier puis d'appeler la méthode format().

Déformater (obtenir le tableau de paramètres selon les règles)

peut être formaté. Bien sûr, nous pouvons également déformater la chaîne pertinente selon les règles de l'instruction pour obtenir la liste des paramètres de l'espace réservé correspondant.

// 根据格式化规则反向获取规则参数
$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,
//   )
Copier après la connexion

En utilisant la méthode parse() instanciée ou directement en utilisant la méthode statique MessageFormatter::parseMessage() peut réaliser une telle opération.

Il est à noter que pour zh_CN, qui est la langue chinoise, cette opération posera des problèmes. Vous pouvez voir le message d'erreur et le code d'erreur via getErrorMessage() et getErrorCode(). Vous pouvez voir que pour le chinois, le message d'erreur renvoyé signifie directement que l'analyse a échoué.

Définir des règles d'acquisition

Dans l'objet instancié, nous pouvons également modifier dynamiquement les instructions de règles.

// 设置获取规则
$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 猴子
Copier après la connexion

Deux méthodes très simples, setPattern() est utilisée pour définir les règles de formatage correspondant à l'instanciation en cours, et getPattern() est utilisée pour obtenir et visualiser les règles de formatage de l'objet d'instanciation en cours. Après avoir défini une nouvelle règle, format() ou parse() sera exécuté selon la nouvelle instruction de règle.

Exemple complet de formatage

Comme mentionné ci-dessus, en plus des nombres, il peut également y avoir des espaces réservés pour les formats de date, démontrons-le.

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 元的电费
Copier après la connexion

Dans cette instruction, l'ordre des paramètres que nous donnons n'est pas dans l'ordre dans lequel les espaces réservés apparaissent dans l'instruction. Cela n'a aucun effet. Il vous suffit de spécifier l'indice du tableau de paramètres à la position correspondante, comme le. first { 3, date, full} spécifie le 4ème élément (à partir de 0) dans le tableau de paramètres.

Le type de date et le type d'heure sont tous deux des types qui peuvent être spécifiés. Bien sûr, nous pouvons également spécifier leur format de date. Par exemple, pour le deuxième espace réservé, nous affichons uniquement les informations sur l'heure, la minute et la seconde actuelles.

S'il s'agit d'informations de chaîne, alors seul un simple {0} est nécessaire. Les chaînes ne nécessitent pas trop de paramètres de type. Les types numériques peuvent être directement formatés en devises et en d'autres types, tout comme les types qui peuvent être spécifiés dans NumberFormatter dont nous avons parlé précédemment.

Après avoir lu cet exemple, ressentez-vous la puissance de ce MessageFormatter ? Ne vous inquiétez pas, il possède des capacités encore plus impressionnantes.

Affichage pluriel basé sur le contenu des paramètres

Pour les nombres pluriels, il n'existe en fait aucune déclaration de ce type dans la grammaire chinoise. Par exemple, un chat est un chat et deux chats sont deux chats.

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
Copier après la connexion

Bien que pluriel dans le type de paramètre signifie pluriel, nous pouvons en fait le considérer comme une instruction switch(). Le nombre

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 只猫
Copier après la connexion

# est le contenu original de la valeur du paramètre correspondant. Cet ensemble de syntaxe amène la classe MessageFormatter à un niveau supérieur, et en plus ! Jetons d'abord un coup d'œil à ce problème :

echo MessageFormatter::formatMessage('en_US', 'I Have {0, plural, =0{no cat} =1{a cat} other{# cats}}', [-1]),PHP_EOL; // I Have -1 cats
Copier après la connexion

Le paramètre est transmis de manière incorrecte, -1 cat est faux, n'est-ce pas ? Ce n'est pas grave, il existe d'autres moyens de résoudre ce problème.

Règles des conditions de sélection

// 选择表达式
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
Copier après la connexion

choice Il ressort du choix des mots qu'il s'agit d'une grammaire liée à la sélection. Les paramètres suivants sont en fait un intervalle, représentant le contenu utilisé dans la plage <= 1 >=2. De plus, une règle d’espace réservé peut également contenir des symboles d’espace réservé.

Résumé

Une fois de plus une révélation. Il n'y a en fait aucune surprise dans les deux premières parties de l'article. Après tout, un remplacement de corde ordinaire peut être effectué, mais cela devient de plus en plus excitant à mesure que l'on remonte vers la fin.

Bien sûr, il devrait y avoir une syntaxe de règle plus associée, mais il y a très peu d'informations à ce sujet. Ni le document officiel PHP ni le document officiel ICU ne peuvent trouver beaucoup d'introduction.

Nous adoptons donc toujours l'attitude d'apprendre et de comprendre d'abord pour savoir qu'une telle chose existe. À l'avenir, nous trouverons des informations plus intéressantes avant de partager et d'apprendre. Nous espérons également que les amis qui l'ont utilisé laisseront un message et. discutons-en ensemble !

Apprentissage recommandé : Tutoriel vidéo php

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
php
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal