2010-05-13 73 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