[英]C# String.Format() Equivalent in PHP?
I'm building a rather large Lucene.NET search expression.我正在构建一个相当大的 Lucene.NET 搜索表达式。 Is there a best practices way to do the string replacement in PHP?
在 PHP 中是否有最佳实践方法来替换字符串? It doesn't have to be this way, but I'm hoping for something similar to the C# String.Format method.
它不一定是这样,但我希望有类似于 C# String.Format 方法的东西。
Here's what the logic would look like in C#.这是 C# 中的逻辑。
var filter = "content:{0} title:{0}^4.0 path.title:{0}^4.0 description:{0} ...";
filter = String.Format(filter, "Cheese");
Is there a PHP5 equivalent?是否有 PHP5 等价物?
You could use the sprintf
function :您可以使用
sprintf
函数:
$filter = "content:%1$s title:%1$s^4.0 path.title:%1$s^4.0 description:%1$s ...";
$filter = sprintf($filter, "Cheese");
Or you write your own function to replace the {
i
}
by the corresponding argument:或者您编写自己的函数以将
{
i
}
替换为相应的参数:
function format() {
$args = func_get_args();
if (count($args) == 0) {
return;
}
if (count($args) == 1) {
return $args[0];
}
$str = array_shift($args);
$str = preg_replace_callback('/\\{(0|[1-9]\\d*)\\}/', create_function('$match', '$args = '.var_export($args, true).'; return isset($args[$match[1]]) ? $args[$match[1]] : $match[0];'), $str);
return $str;
}
尝试 sprintf http://php.net/sprintf
try this one if there is an error or 'create_function'如果出现错误或“create_function”,请尝试此操作
public static function format()
{
$args = func_get_args();
$format = array_shift($args);
preg_match_all('/(?=\{)\{(\d+)\}(?!\})/', $format, $matches, PREG_OFFSET_CAPTURE);
$offset = 0;
foreach ($matches[1] as $data) {
$i = $data[0];
$format = substr_replace($format, @$args[$i], $offset + $data[1] - 1, 2 + strlen($i));
$offset += strlen(@$args[$i]) - 2 - strlen($i);
}
return $format;
}
Using preg_replace_callback
with a modern approach, we can even use a helper class library to support dot notation ( adbario/php-dot-notation ) inside out format along with array keys:使用具有现代方法的
preg_replace_callback
,我们甚至可以使用辅助类库来支持点符号( adbario/php-dot-notation )由内而外的格式以及数组键:
use \Adbar\Dot;
function format($text, ...$args)
{
$params = new Dot([]);
if (count($args) === 1 && is_array($args[0])) {
$params->setArray($args[0]);
} else {
$params->setArray($args);
}
return preg_replace_callback(
'/\{(.*?)\}/',
function ($matches) use ($params) {
return $params->get($matches[1], $matches[0]);
},
$text
);
}
And we can use it like this:我们可以这样使用它:
> format("content:{0} title:{0}^4.0 path.title:{0}^4.0 description:{0} ...", "Cheese");
"content:Cheese title:Cheese^4.0 path.title:Cheese^4.0 description:Cheese ..."
> format(
'My name is {name} and my age is {age} ({name}/{age})',
['name' => 'Christos', 'age' => 101]
);
"My name is Christos and my age is 101 (Christos/101)"
> format(
'My name is {name}, my age is {info.age} and my ID is {personal.data.id} ({name}/{info.age}/{personal.data.id})',
[
'name' => 'Chris',
'info' => [
'age' => 40
],
'personal' => [
'data' => [
'id' => '#id-1234'
]
]
]
);
"My name is Christos, my age is 101 and my ID is #id-1234 (Christos/101/#id-1234)"
Of course we can have a simple version without any extra libraries if we don't want multilevel array support using dot notation:当然,如果我们不想使用点表示法支持多级数组,我们可以有一个没有任何额外库的简单版本:
function format($text, ...$args)
{
$params = [];
if (count($args) === 1 && is_array($args[0])) {
$params = $args[0];
} else {
$params = $args;
}
return preg_replace_callback(
'/\{(.*?)\}/',
function ($matches) use ($params) {
if (isset($params[$matches[1]])) {
return $params[$matches[1]];
}
return $matches[0];
},
$text
);
}
I came up with this solution: https://github.com/andreasahlen/StringNetFormat我想出了这个解决方案: https://github.com/andreasahlen/StringNetFormat
Very simple, because at first stage... feel free to use it.很简单,因为在第一阶段......随意使用它。
print StringNetFormat("Hallo {0}, {1}, and {2}, ({0}, {1}, {2})", array ("Harry", "Doreen", "Wakka"));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.