2010-05-13 112 views
0

我有一個Joomla插件(在這個上下文中不重要),它被設計爲用一系列的數字(在一段文本內)加載一個數字的輸入並用一系列的s代替它們。使用preg_replace替換值

我的問題是,我需要對我的$ article->文本做一個preg_replace,但我不知道如何將更改應用到匹配的條件。我見過preg_replace_callback,但我不知道如何在函數內調用它。

function onPrepareContent(&$article, &$params, $limitstart) 
    { 
     global $mainframe; 
     // define the regular expression 
     $pattern = "#{lotterynumbers}(.*?){/lotterynumbers}#s"; 
     if(isset($article->text)){ 
      preg_match($pattern, $article->text, $matches); 
      $numbers = explode("," , $matches[1]); 
      foreach ($numbers as $number) { 
       echo "<div class='number'><span>" . $number . "</span></div>"; 
      } 
     }else{ 
      $article->text = 'No numbers'; 
     } 
     return true; 
    } 

經修訂的守則:

function onPrepareContent(&$article, &$params, $limitstart) 
    { 
     global $mainframe; 
     // define the regular expression 
     $pattern = "#{lotterynumbers}(.*?){/lotterynumbers}#s"; 
     if(isset($article->text)){ 
      preg_match($pattern, $article->text, $matches); 
      $numbers = explode("," , $matches[1]); 
      foreach ($numbers as $number) { 
       $numberlist[] = "<div class='number'><span>" . $number . "</span></div>"; 
      } 
      $numberlist = implode("", $numberlist); 
      $article->text = preg_replace($pattern, $numberlist, $article->text); 

     }else{ 
      $article->text = 'No numbers'; 
     } 
     return true; 
    } 
+0

我已經使用該功能之前,所以我可以幫你,但你必須給我解釋一下更好的問題 – mck89 2010-05-13 15:36:12

+0

道歉的人,當我重新讀它,我想知道它是否有道理。 我已經重寫它到所需的效果,但它似乎很繁瑣。理想的結果是: 1)查找文本 2)提取的數字(CSV術語{} lotterynumbers)和環繞每一個 3一個div)泵回至$物品─>文本 我已將修改後的代碼放入問題 – Jeepstone 2010-05-13 15:41:47

+0

爲什麼修改的函數不起作用?看起來沒問題。 – mck89 2010-05-13 15:45:47

回答

1
function onPrepareContent(&$article, &$params, $limitstart) 
{ 
    global $mainframe; 
    // define the regular expression 
    $pattern = "#{lotterynumbers}(.*?){/lotterynumbers}#s"; 
    if(isset($article->text)){ 
     $article->text=preg_replace_callback($pattern,create_function('$match','$init="<div class=\'number\'><span>";$out="</span></div>"; return $init.implode($out.$init,explode(",",$match[1])).$out;'),$article->text); 

    }else{ 
     $article->text = 'No numbers'; 
    } 
    return true; 
} 

我沒有測試它,但它應該工作

+0

謝謝mck89。我已經把答案記入你了,儘管這兩種方法都有效。這是維護性/可讀性與技術解決方案的一個例子。在任何情況下都有用作參考。 Pete – Jeepstone 2010-05-14 08:28:19