2011-10-07 14 views
12

पायथन में template strings नामक एक सुविधा है।क्या PHP में पाइथन के टेम्पलेट स्ट्रिंग जैसी सुविधा है?

>>> from string import Template 
>>> s = Template('$who likes $what') 
>>> s.substitute(who='tim', what='kung pao') 
'tim likes kung pao' 

मुझे पता है कि पीएचपी आप लिखने के लिए अनुमति देता है:

"Hello $person" 

और $person स्थानापन्न कर दिया है, लेकिन टेम्पलेट्स कोड के विभिन्न वर्गों में पुन: उपयोग किया जा सकता है?

उत्तर

3

तुम भी इस्तेमाल कर सकते हैं strtr:

$template = '$who likes $what'; 

$vars = array(
    '$who' => 'tim', 
    '$what' => 'kung pao', 
); 

echo strtr($template, $vars); 

आउटपुट:

tim likes kung pao 
6

मुझे लगता है कि ऐसा करने के कई तरीके हैं ... लेकिन यह दिमाग में आता है।

$search = array('%who%', '%what_id%'); 
$replace = array('tim', 'kung pao'); 
$conference_target = str_replace(
    $search, 
    $replace, 
    "%who% likes %what%" 
); 

हा, हम भी vsprintf का उपयोग कर हमारे ढांचे में एक था:

class Helper_StringFormat { 

    public static function sprintf($format, array $args = array()) { 

     $arg_nums = array_slice(array_flip(array_keys(array(0 => 0) + $args)), 1); 

     for ($pos = 0; preg_match('/(?<=%)\(([a-zA-Z_]\w*)\)/', $format, $match, PREG_OFFSET_CAPTURE, $pos);) { 
      $arg_pos = $match[0][2]; 
      $arg_len = strlen($match[0][0]); 
      $arg_key = $match[1][0]; 

      if (! array_key_exists($arg_key, $arg_nums)) { 
       user_error("sprintfn(): Missing argument '${arg_key}'", E_USER_WARNING); 
       return false; 
      } 
      $format = substr_replace($format, $replace = $arg_nums[$arg_key] . '$', $arg_pos, $arg_len); 
      $pos = $arg_pos + strlen($replace); 
     } 

     return vsprintf($format, array_values($args)); 
    } 
} 

कौन सा लग रहा है ऐसा लगता है जैसे the sprintf page

इस तरह कॉल के लिए अनुमति देता है से आया था:

sprintfn('second: %(second)s ; first: %(first)s', array(
    'first' => '1st', 
    'second'=> '2nd' 
)); 

अद्यतन
यहाँ आप क्या करना चाहते हैं के लिए एक अद्यतन ... पूरी तरह से परीक्षण हालांकि

class Helper_StringFormat { 

    public static function sprintf($format, array $args = array()) { 
     $arg_nums = array_slice(array_flip(array_keys(array(0 => 0) + $args)), 1); 

     for ($pos = 0; preg_match('/(?<=%)\(([a-zA-Z_][\w\s]*)\)/', $format, $match, PREG_OFFSET_CAPTURE, $pos);) { 
      $arg_pos = $match[0][1]; 
      $arg_len = strlen($match[0][0]); 
      $arg_key = $match[1][0]; 

      if (! array_key_exists($arg_key, $arg_nums)) { 
       user_error("sprintfn(): Missing argument '${arg_key}'", E_USER_WARNING); 
       return false; 
      } 
      $format = substr_replace($format, $replace = $arg_nums[$arg_key] . '$', $arg_pos, $arg_len); 
      $pos = $arg_pos + strlen($replace); // skip to end of replacement for next iteration 
     } 

     return vsprintf($format, array_values($args)); 
    } 
} 

$str = "%(my var)s now work with a slight %(my var2)s"; 
$repl = array("my var" => "Spaces", "my var2" => "modification."); 

echo Helper_StringFormat::sprintf($str, $repl); 

आउटपुट
रिक्त स्थान अब एक मामूली संशोधन के साथ काम नहीं है।

+0

यह अच्छा है, सिवाय इसके कि '% (कुछ वर्ण) 'अनुक्रम से बचने का कोई तरीका नहीं है। अगर मैं इसे ठीक करने के लिए कभी भी गोल करता हूं, तो मैं इस थ्रेड में कोड पोस्ट करूंगा – Casebash

+0

आपके दूसरे लिंक नाम बीटीडब्ल्यू में एक टाइपो है। (Sprtinf) – peipst9lker

1

मैंने जो कुछ भी आप चाहते हैं उसे करने के लिए एक समारोह बनाया है। मैंने इसे "quck-and-dirty" बनाया क्योंकि मेरे पास इसे पुन: सक्रिय करने के लिए अधिक समय नहीं है, शायद मैं इसे अपने github पर अपलोड कर सकता हूं।

संपादित करें: एक बग सुधार ...

[a-zA-Z0-9_] केवल

formattemplatter(
        '$who likes $what' 
        , array(
           'who' => 'Tim' 
          , 'what' => 'Kung Pao' 
        ) 
    ); 

चर की तरह इसका इस्तेमाल हो सकता है।

function formattemplater($string, $params) { 
    // Determine largest string 
    $largest = 0; 
    foreach(array_keys($params) as $k) { 
     if(($l=strlen($k)) > $largest) $largest=$l; 
    } 

    $buff = ''; 

    $cp  = false; // Conditional parenthesis 
    $ip  = false; // Inside parameter 
    $isp = false; // Is set parameter 

    $bl  = 1; // buffer length 
    $param = ''; // current parameter 

    $out = ''; // output string 
    $string .= '!'; 

    for($sc=0,$c=$oc='';isset($string{$sc});++$sc,++$bl) { 
     $c = $string{$sc}; 

     if($ip) { 
      $a = ord($c); 

      if(!($a == 95 || (     // underscore 
        ($a >= 48 && $a <= 57)  // 0-9 
        || ($a >= 65 && $a <= 90) // A-Z 
        || ($a >= 97 && $a <= 122) // a-z 
       ) 
      )) { 

       $isp = isset($params[$buff]); 

       if(!$cp && !$isp) { 
        trigger_error(
          sprintf(
            __FUNCTION__.': the parameter "%s" is not defined' 
            , $buff 
          ) 
          , E_USER_ERROR 
        ); 
       } elseif(!$cp || $isp) { 
        $out .= $params[$buff]; 
       } 

       $isp = $isp && !empty($params[$buff]); 
       $oc  = $buff = ''; 
       $bl  = 0; 
       $ip  = false; 
      } 
     } 

     if($cp && $c === ')') { 
      $out .= $buff; 

      $cp = $isp = false; 
      $c = $buff = ''; 
      $bl = 0; 
     } 

     if(($cp && $isp) || $ip) 
      $buff .= $c; 

     if($c === '$' && $oc !== '\\') { 
      if($oc === '(') $cp = true; 
      else $out .= $oc; 

      $ip = true; 
      $buff = $c = $oc = ''; 
      $bl = 0; 
     } 

     if(!$cp && $bl > $largest) { 
      $buff = substr($buff, - $largest); 
      $bl  = $largest; 
     } 

     if(!$ip && (!$cp || ($cp && $isp))) { 
      $out .= $oc; 
      if(!$cp) $oc = $c; 
     } 
    } 

    return $out; 
} 
0

एक और अधिक सरल दृष्टिकोण यह होगा:

$s = function ($vars) { 
    extract($vars); 
    return "$who likes $what"; 
}; 
echo $s(['who' => 'Tim', 'what' => 'King Pao']); // Tim likes King Pao 

और हाँ, PHPStorm शिकायत ...

संबंधित मुद्दे