هل PHP لديك ما يعادل هذا النوع من سلسلة الثعبان بديل ؟

StackOverflow https://stackoverflow.com/questions/28165

  •  09-06-2019
  •  | 
  •  

سؤال

الثعبان لديه هذه الطريقة الرائعة التعامل مع سلسلة التبديلات باستخدام القواميس:

>>> '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".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top