2015-05-02 41 views
1

此刻我正在尋找一種方法從字符串調用方法。我的字符串看起來是這樣的:從字符串創建一個方法調用

"Hello, here's the Link you look for: [[Link,internLink,Go,Login]]." 

我想替換[[Link,internLink,Go,Login]]有:

K :: gI('Link')->internLink('Go', 'Login'); 

有沒有辦法?原因是,我得到了保存在我的數據庫中的各種文本,我需要在這些文本中調用方法。也只有第一個參數(這裏:鏈接和internLink)總是看起來是類和方法。這兩個參數後,可能會從0 - XXX參數,這取決於方法。我過度訓練。

編輯:我試圖與preg_replace工作,但我打開一個完整的新方法,如果有必要!

回答

0
<?php 
$subject = "Hello, here's the Link you look for: [[Link,internLink,Go,Login]]."; 

$result = preg_replace_callback(
     '/\[\[(.*?)]\]/', 
     function ($matches) { 
      $args = explode(",", $matches[1]); 
      $args = array_map("trim", $args); 

      $x1 = !empty($args[0])?$args[0]:"default"; 
      $x2 = isset($args[1])?$args[1]:"default"; 
      $x3 = ""; 

      $args = array_slice($args, 2); 
      if (count($args) > 0) { 
       $x3 = "'" . implode("', '", $args) . "'"; 
      } 
      return "K :: gI('$x1')->$x2($x3);"; 
     }, 
     $subject 
    ); 

echo "$result\n"; 
+0

工作正常!只有兩個問題:我如何讓PHP「運行」這種方法?像現在它轉換爲我需要的字符串,但我可以運行它嗎?我試過'eval()',但它不會工作,我聽說eval是邪惡的......這是真的嗎? – Philip

0

所以這是我的最後一個方法:

PUBLIC function formatClasses($b) { 

     $subject = $b; 

     $result = 
      preg_replace_callback(
       '/\[\[(.*?)]\]/', 
       function ($matches) { 
        $args = explode(",", $matches[1]); 
        $args = array_map("trim", $args); 

        $x1 = !empty($args[0])?$args[0]:"default"; 
        $x2 = isset($args[1])?$args[1]:"default"; 

        $args = array_slice($args, 2); 

        return call_user_func_array(array(K :: gI($x1), $x2), $args); 

       }, 
       $subject 
      ); 

     return $result; 

} 

非常感謝維克多!