2016-05-29 48 views
4

这是我的功能,它可以帮助我生成链接。所以在这里构造我从数据库中获取数据。现在我想从db记录生成链接,如http://localhost/myCrm/my_module/edit/3/1我知道它将需要字符串替换,但我陷入了如何做到这一点?需要动态替换字符串的参数

function getLinks(array $Links, bool $actions = true) 
{ 
    $data = $this->data; 

    /* $data will look like this. 
     But it will vary on because this function will be used 
     over different schema to generate the links */ 
    // $data = ['id'=>'1', 'module_id' => '3', 'item_id' => '1']; 

    $action = ""; 

    if($actions && $Links) 
    { 
     foreach ($Links as $key => $value) 
     { 
      $url = ""; 
      // $url = "i need url replaced with the key defined in '{}' from $data[{key}] " 

      $action .= '<a href="'.$url.'" >'.$value['text'].'</a>'; 
     } 
    } 
} 



$Links = [ 
    [ 
     'text' => 'Edit' 
     'url' => base_url('my_module/edit/{module_id}/{item_id}') 
    ] 
]; 

任何帮助表示赞赏。

+0

那么'str_replace'呢? –

+0

它不会在这里工作,因为我会从字符串中替换列名称。 – user5181531

回答

4

在这种情况下,你将需要使用preg_replace_callback功能。在preg_replace_callback中,您可以通过关闭进行有效更改。你可以拿到赛从$比赛中封闭

//Your code will look like this 
if($actions && $Links) 
{ 
    foreach ($Links as $key => $value) 
    { 
     $url = preg_replace_callback(

      "/(?:\{)([a-zA-Z0-9_]+)(?:\})/", 

      function($matches) use($data) 
      { 
       return $data[$matches[1]]; 
      }, 

      $value['url'] 
     ); 

     $action .= '<a href="'.$url.'" >'.$value['text'].'</a>'; 
    } 
} 

在这个表达式(?:\{)代表非捕获组通过。这意味着匹配将被执行,但不会被捕获。所以它将匹配字符串中的module_iditem_id,以便您可以在此处获取索引并用您的数据替换。

+0

非常感谢你pratik。这正是我想要的。非常感谢你的回答。 – user5181531