【问题标题】:Replacing values using preg_replace使用 preg_replace 替换值
【发布时间】:2011-02-19 03:47:18
【问题描述】:

我有一个 Joomla 插件(在这种情况下并不重要),该插件旨在接受带有大量数字的输入(在一段文本中)并用一系列 s 替换它们。

我的问题是我需要对我的 $article->text 进行 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;
    }

【问题讨论】:

  • 我以前用过这个功能,所以我可以帮助你,但你必须更好地向我解释这个问题
  • 抱歉伙计们,当我重新阅读它时,我想知道它是否有意义。我已经将它重写为预期的效果,但它似乎很麻烦。期望的结果是:1)在文本中找到术语 {lotterynumbers} 2)提取数字(csv)并在每个数字周围包装一个 div 3)将其泵回 $article->text 我已将修改后的代码放入问题
  • 为什么修改后的功能不起作用?好像没问题。
  • 只是先做 preg_match,然后再做 preg_replace 似乎有点麻烦。
  • 使用 preg_replace_callback 函数,您必须先执行 preg_replace_callback,然后再执行 preg_replace,所以我认为这不会更好:)

标签: php regex preg-replace preg-replace-callback


【解决方案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;
}

我没有测试过,但应该可以工作

【讨论】:

  • 感谢 mck89。尽管这两种方法都有效,但我已将答案归功于您。这是可维护性/可读性与技术解决方案的案例。对任何一种情况都有参考价值。皮特
猜你喜欢
  • 2011-01-24
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
  • 2014-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
相关资源
最近更新 更多