我实际上试图找出PHP ^7是否最终有一个原生的,但显然没有xD。mb_sprintf()
为了完整起见,这是我在一些旧项目中一直使用的简单解决方案。它只是将 & 之间的差异添加到所需的 。添加非多字节示例只是为了便于比较 =)。strlen
mb_strlen
$targetLengh
$text = "Gultigkeitsprufung ist fehlgeschlagen: %{errors}";
$mbText = "Gültigkeitsprüfung ist fehlgeschlagen: %{errors}";
$mbTextRussian = "Проверка не удалась: %{errors}";
$targetLength = 60;
$mbTargetLength = strlen($mbText) - mb_strlen($mbText) + $targetLength;
$mbRussianTargetLength = strlen($mbTextRussian) - mb_strlen($mbTextRussian) + $targetLength;
printf("%{$targetLength}s\n", $text);
printf("%{$mbTargetLength}s\n", $mbText);
printf("%{$mbRussianTargetLength}s\n", $mbTextRussian);
结果
Gultigkeitsprufung ist fehlgeschlagen: %{errors}
Gültigkeitsprüfung ist fehlgeschlagen: %{errors}
Проверка не удалась: %{errors}
更新2019-06-12
@flowtron让我再想一想。一个简单的可能看起来像这样。mb_sprintf()
function mb_sprintf($format, ...$args) {
$params = $args;
$callback = function ($length) use (&$params) {
$value = array_shift($params);
return strlen($value) - mb_strlen($value) + $length[0];
};
$format = preg_replace_callback('/(?<=%|%-)\d+(?=s)/', $callback, $format);
return sprintf($format, ...$args);
}
echo mb_sprintf("%-10s %-10s %10s\n", 'thüs', 'wörks', 'ök');
echo mb_sprintf("%-10s %-10s %10s\n", 'this', 'works', 'ok');
结果
thüs wörks ök
this works ok
我在这里只做了一些快乐的路径测试,但它适用于PHP >=5.6,应该足够好,可以给ppl一个关于如何封装行为的想法。它不适用于重复/顺序修饰符 - 例如 将被忽略/保持不变。%1$20s