Heim  >  Artikel  >  Backend-Entwicklung  >  So lernen Sie Informationsformatierungsvorgänge in PHP

So lernen Sie Informationsformatierungsvorgänge in PHP

醉折花枝作酒筹
醉折花枝作酒筹nach vorne
2021-07-02 15:15:142269Durchsuche

Während des Erlernens der internationalen Komponente wurden wir bereits mit der Zahlenformatierungsoperation von NumberFormatter vertraut gemacht, die es uns ermöglicht, Zahlen in Standardformate, Währungen, lokale Sprachen usw. umzuwandeln. Heute lernen wir eine andere Klasse MessageFormatter kennen, die speziell für die Informationsformatierung verwendet wird. Sie wird hauptsächlich für Zeichenfolgenoperationen verwendet.

So lernen Sie Informationsformatierungsvorgänge in PHP

MessageFormatter folgt ebenfalls der ICU-Spezifikation. Die unterste Ebene ist die ICU-Operation in C, daher gibt es keinen großen Unterschied bei der Verwendung von C-bezogenem Code.

Format

// 格式化
$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

Siehst du? Ähnlich wie Platzhalter für Vorkompilierungsvorgänge in PDO. Nach dem Aufruf der Methode format() können Sie die Parameter in dieser Methode den Inhalt des Platzhalters ersetzen lassen.

Wir können den Parametertyp und die Position angeben, die vom Platzhalter verwendet werden: {Parameter-Subskript, Typ, erweiterter Typ}. Dies ist die Regeldefinition des Platzhalters für die Formatierung dieser Informationsdaten. Es scheint sehr einfach zu sein, aber tatsächlich hat es mehr Funktionen, die wir später sehen werden.

Es ist jedoch zu beachten, dass nur Zahlen, Datumsangaben und Textfragmenttypen unterstützt werden. Offizielle Dokumente sind im Referenzlink am Ende des Artikels verfügbar.

MessageFormatter::formatMessage() Diese statische Methode kann die Sprache, vorbereitete Anweisungen und Ersetzungsparameter gleichzeitig angeben, ohne dass die Methode format() instanziiert und dann aufgerufen werden muss.

Deformatieren (Parameterarray gemäß Regeln abrufen)

Natürlich können wir verwandte Zeichenfolgen auch gemäß Anweisungsregeln deformatieren, um die dem Platzhalter entsprechende Parameterliste zu erhalten.

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

Mit der instanziierten parse()-Methode oder direkt mit der statischen Methode MessageFormatter::parseMessage() kann eine solche Operation erreicht werden.

Es ist zu beachten, dass dieser Vorgang für zh_CN, das chinesische Sprachgebietsschema, Probleme verursachen wird. Sie können die Fehlermeldung und den Fehlercode über getErrorMessage() und getErrorCode() anzeigen. Für Chinesisch können Sie sehen, dass die zurückgegebene Fehlermeldung direkt bedeutet, dass die Analyse fehlgeschlagen ist.

Erfassungsregeln festlegen

Im instanziierten Objekt können wir die Regelanweisungen auch dynamisch ändern.

// 设置获取规则
$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 猴子

Zwei sehr einfache Methoden: setPattern() wird verwendet, um die Formatierungsregeln festzulegen, die der aktuellen Instanziierung entsprechen, und getPattern() wird verwendet, um die Formatierungsregeln des aktuellen Instanziierungsobjekts abzurufen und anzuzeigen. Nach dem Festlegen einer neuen Regel wird format() oder parse() gemäß der neuen Regelanweisung ausgeführt.

Komplettes Formatierungsbeispiel

Wie oben erwähnt, kann es neben Zahlen auch Platzhalter für Datumsformate geben, lassen Sie es uns demonstrieren.

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 元的电费

In dieser Anweisung stimmt die Reihenfolge der von uns angegebenen Parameter nicht mit der Reihenfolge überein, in der die Platzhalter in der Anweisung erscheinen. Sie müssen lediglich den Parameter-Array-Index an der entsprechenden Position angeben first { 3, date, full} gibt das 4. Element (beginnend bei 0) im Parameterarray an.

Datumstyp und Zeittyp sind beide Typen, die angegeben werden können. Natürlich können wir auch ihr Datumsformat angeben. Für den zweiten Platzhalter zeigen wir beispielsweise nur die aktuellen Stunden-, Minuten- und Sekundeninformationen an.

Wenn es sich um String-Informationen handelt, ist nur ein einfaches {0} erforderlich. Strings erfordern nicht zu viele Typeinstellungen. Numerische Typen können direkt in Währungs- und andere Typen formatiert werden, genau wie die Typen, die in NumberFormatter angegeben werden können, über die wir zuvor gesprochen haben.

Spüren Sie nach dem Lesen dieses Beispiels die Leistungsfähigkeit dieses MessageFormatter? Keine Sorge, es bietet noch mehr tolle Funktionen.

Pluralanzeige basierend auf dem Parameterinhalt

Für Pluralzahlen gibt es in der chinesischen Grammatik tatsächlich keine solche Aussage. Beispielsweise ist eine Katze eine Katze und zwei Katzen sind zwei Katzen.

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

Obwohl der Parametertyp Plural Plural bedeutet, können wir ihn uns tatsächlich als eine switch()-Anweisung vorstellen. Die Zahl

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 只猫

# ist der ursprüngliche Inhalt des entsprechenden Parameterwerts. Dieser Syntaxsatz bringt die MessageFormatter-Klasse auf eine höhere Ebene, und noch mehr! Schauen wir uns zunächst dieses Problem an:

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

Der Parameter wurde falsch übergeben, -1 cat ist falsch, oder? Es spielt keine Rolle, es gibt andere Möglichkeiten, dieses Problem zu lösen.

Regeln für Auswahlbedingungen

// 选择表达式
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

choice Aus der Wortwahl ist ersichtlich, dass es sich um eine auswahlbezogene Grammatik handelt. Die folgenden Parameter sind tatsächlich ein Intervall, das angibt, welcher Inhalt im Bereich von <= 1 | verwendet wird. Darüber hinaus kann eine Platzhalterregel auch Platzhaltersymbole enthalten.

Zusammenfassung

Wieder ein Augenöffner. In den ersten beiden Teilen des Artikels gibt es eigentlich keine Überraschungen. Immerhin ist ein gewöhnlicher Saitenaustausch möglich, aber je weiter man nach hinten geht, desto spannender wird es.

Natürlich sollte es mehr verwandte Regelsyntax geben, aber weder im offiziellen PHP-Dokument noch im offiziellen ICU-Dokument finden sich viele Informationen.

Also nehmen wir immer noch die Einstellung an, zuerst zu lernen und zu verstehen, dass es so etwas gibt. In Zukunft werden wir weitere interessante Informationen finden, bevor wir sie teilen und lernen. Wir hoffen auch, dass Freunde, die sie verwendet haben, eine Nachricht hinterlassen Besprechen Sie es gemeinsam!

Empfohlenes Lernen: php-Video-Tutorial

Das obige ist der detaillierte Inhalt vonSo lernen Sie Informationsformatierungsvorgänge in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Vorheriger Artikel:Wie viele Bytes hat PHP int?Nächster Artikel:Wie viele Bytes hat PHP int?