PHP preg_replace所有标记出现

时间:2014-08-07 08:42:35

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

我有这个:

$tagName = "id";
$value = "ID12345";
$text = "<%id%> some text <%id%> something";
$a = new A();
echo $a->replaceAllTags($tagName, $value, $text);

我想创建这个:

"ID12345 some text ID12345 something"

试过这个但没有工作:

private function replaceAllTags($tagName, $value, $text)
{
    $pattern = "/<%" . $tagName . "%>/";
    while (preg_match($pattern, $text)) {
        $text = preg_replace($pattern, $value, $text);
    }
    return $text;
}

这也不起作用:

private function replaceAllTags($tagName, $value, $text)
{
    $pattern = "/<%(" . $tagName . ")%>/";
    $text = preg_replace_callback($pattern, 
        function($m) {
           return $value;
    }, $text);
    return $text;
}

我搜索了很多,但没有解决我的问题。

EDITED: 问题是我写了一个PHPUnit测试并且&lt;%id&gt;而不是&lt;%id%&gt;。

P.s:私人应该公开

5 个答案:

答案 0 :(得分:1)

除了真正需要正则表达式之外,在我看来问题在于“私人”可见性。您想从外部访问的方法需要“公共”可见性。

http://php.net/manual/en/language.oop5.visibility.php

答案 1 :(得分:1)

  1. 您的方法A :: replaceAllTags声明为私有而非公共。详情here
  2. 如果您想使用正则表达式 - 请尝试使用此代码段。

    class A { 
         public function replaceAllTags($tagName, $value, $text) {
             $pattern = "/<%(" . $tagName . ")%>/";
             $text = preg_replace($pattern, $value, $text);
             return $text;    
         }    
     }
    
  3. 我建议你使用简单的str_replace。像这样:

    public function replaceAllTags($tagName, $value, $text) {
        $pattern = "<%" . $tagName . "%>";
        $text = str_replace($pattern, $value, $text);
        return $text;
    }
    

答案 2 :(得分:0)

您应该使用str_replace代替。

private function replaceAllTags($tagName, $value, $text)
{
    $pattern = "<%" . $tagName . "%>";
    $text = str_replace($pattern, $value, $text);
    return $text;
}

答案 3 :(得分:0)

这对我来说很好用但是试试看:

<?php
     function replaceAllTags($tagName, $value, $text)
    {
        $pattern = "/(<%)(" . $tagName . ")(%>)/";
        while (preg_match($pattern, $text)) {
            $text = preg_replace($pattern, $value, $text);
        }
        return $text;
    }
    $tagName = "id";
    $value = "ID12345";
    $text = "<%id%> some text <%id%> something";

    echo replaceAllTags($tagName, $value, $text);
?>

结果是: ID12345一些文字ID12345

答案 4 :(得分:0)

任何功能都没有错!请记住,您的函数是私有函数,只能使用该类访问!