هل PHP لديك ما يعادل هذا النوع من سلسلة الثعبان بديل ؟
سؤال
الثعبان لديه هذه الطريقة الرائعة التعامل مع سلسلة التبديلات باستخدام القواميس:
>>> 'The %(site)s site %(adj)s because it %(adj)s' % {'site':'Stackoverflow', 'adj':'rocks'}
'The Stackoverflow site rocks because it rocks'
أنا أحب هذا لأنه يمكنك تحديد قيمة مرة واحدة في القاموس ثم يحل محله في كل مكان في السلسلة.
لقد حاولت تحقيق شيء مماثل في PHP باستخدام مختلف سلسلة استبدال الوظائف ولكن كل شيء كنت تأتي مع شعور غريب.
لا أحد لديك لطيفة نظيفة طريقة للقيام بهذا النوع من سلسلة الاستبدال في PHP?
تحرير
هنا هو رمز من sprintf صفحة أنا أحب أفضل.
<?php
function sprintf3($str, $vars, $char = '%')
{
$tmp = array();
foreach($vars as $k => $v)
{
$tmp[$char . $k . $char] = $v;
}
return str_replace(array_keys($tmp), array_values($tmp), $str);
}
echo sprintf3( 'The %site% site %adj% because it %adj%', array('site'=>'Stackoverflow', 'adj'=>'rocks'));
?>
المحلول
function subst($str, $dict){
return preg_replace(array_map(create_function('$a', 'return "/%\\($a\\)s/";'), array_keys($dict)), array_values($dict), $str);
}
كنت اسميها مثل ذلك:
echo subst('The %(site)s site %(adj)s because it %(adj)s', array('site'=>'Stackoverflow', 'adj'=>'rocks'));
نصائح أخرى
أنا لا أعرف إذا كان أسرع, ولكن يمكنك أن تفعل ذلك دون regexes:
function subst($str, $dict)
{
foreach ($dict AS $key, $value)
{
$str = str_replace($key, $value, $str);
}
return $str;
}
بعض من المستخدم ساهم الملاحظات و المهام في PHP وثائق sprintf تأتي قريبة جدا.
ملاحظة:البحث في صفحة "sprintf2".
لا تنتمي إلى StackOverflow