2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

python の string.format が便利だからPHPでも使いたい

Last updated at Posted at 2018-10-22

python の string.format とは

Python3 には sprintf にあたる string.format メソッドが存在しますが、 C言語風とは違っていて、テンプレートぽく使えて便利です。

context = {
    'name': '太郎',
    'point': 10,
}
print('[お知らせ] {name}から{point}ポイント送信されました'.format_map(context))
実行結果
[お知らせ] 太郎から10ポイント送信されました

この方式だと、テンプレート文字列の中に {point} が複数回出てきた場合などにも context の定義を増やしたりしなくて良いので便利です。

python には string.Template というクラスがあって、こいつも超簡易なテンプレートみたいな感じなんですが、帯に短し襷に長しみたいな感じで、ほとんどの使途を string.format メソッドで置き換え可能です。

そして、最近は PHP をやっているので、これを PHP でも使いたいなというお話です。

PHP で Python の string.format 相当の処理

<?php
  
$context = [
        '{name}' => '太郎',
        '{point}' => 10,
];
echo strtr('[お知らせ] {name}から{point}ポイント送信されました', $context) . PHP_EOL;
実行結果
[お知らせ] 太郎から10ポイント送信されました

ただの strtr 関数の使い方の説明になってしまっているので、しょぼい話ですが、 Python の string.format の便利さから個人的に再発見したという感じで、便利やんと思ったので書きました。

補足

テンプレートとして、値を埋められない時に何も表示しないという振る舞いを一般的にきちんとしたテンプレートはするし、printf 的なフォーマットではプレースホルダの数が合わないとエラーになります。

個人的には何も表示しないというのは、間違いを見落としがちであまり好きではありませんが、一応同じ振る舞いには出来ます。Pythonも同じことです。

プレースホルダを表示しない

$context = [
        '{name}' => '太郎',
];
$doc = strtr('[お知らせ] {name}から{point}ポイント送信されました', $context) . PHP_EOL;
echo preg_replace('/{[^}]+}/', '', $doc);
実行結果
[お知らせ] 太郎からポイント送信されました

プレースホルダが一致しない場合は例外

<?php
$context = [
    '{name}' => '太郎',
];
$doc = strtr('[お知らせ] {name}から{point}ポイント送信されました', $context) . PHP_EOL;
if (preg_match('/{[^}]+}/', $doc)) {
    throw new Exception('Format error: Too few parameters');
}
echo $doc;
実行結果
PHP Fatal error:  Uncaught Exception: --
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?