php:动态preg_替换

php:动态preg_替换,php,regex,preg-replace,Php,Regex,Preg Replace,下面的代码不是一个有效的方法,它只是用来帮助您理解我要做的事情 // $i = occurrence to replace // $r = content to replace private function inject($i, $r) { // regex matches anything in the format {value|:value} $output = preg_replace('/\{(.*?)\|\:(.*?)\}/', '$r', $this

下面的代码不是一个有效的方法,它只是用来帮助您理解我要做的事情


// $i = occurrence to replace
// $r = content to replace

private function inject($i, $r) {
      // regex matches anything in the format {value|:value}
      $output = preg_replace('/\{(.*?)\|\:(.*?)\}/', '$r', $this->source);
      $output[$i]
}
如何在$output中找到$I事件;并将其替换为$r


注意:我只想使用$I(一个数字)来查找preg_replace中出现的nmber;对于exmaple:我可能想用变量$r替换preg_replace模式的第二个匹配项,我认为您只能通过回调来完成这样的匹配项计数:

private function inject($i, $r) {
      $this->i = $i;
      $this->r = $r;

      // regex matches anything in the format {value|:value}
      $output = preg_replace_callback('/\{(.*?)\|\:(.*?)\}/',
                array($this, "inject_cb"), $this->source);
}

function inject_cb($match) {
    if ($this->i --) {
        return $match[0];
    }
    else {
        return $this->r;
    }
}

它保持第一个
$i
匹配不变,并在匹配倒计时时使用tempoary
$this->r
一次。可以通过闭包来避免
->$i
->$r
但是。

我认为您只能通过回调来完成此类事件计数:

private function inject($i, $r) {
      $this->i = $i;
      $this->r = $r;

      // regex matches anything in the format {value|:value}
      $output = preg_replace_callback('/\{(.*?)\|\:(.*?)\}/',
                array($this, "inject_cb"), $this->source);
}

function inject_cb($match) {
    if ($this->i --) {
        return $match[0];
    }
    else {
        return $this->r;
    }
}

它保持第一个
$i
匹配不变,并在匹配倒计时时使用tempoary
$this->r
一次。可以使用闭包来避免
->$i
->$r
但是。

$i是否包含要查找的正则表达式或字符串?在$i中有什么?整个模式?需要更多详细信息。匹配项的出现次数$例如,我可能是1,正则表达式需要找到1的出现,并用$r替换它@willm1是字符串出现的次数。$i是否包含正则表达式或要查找的字符串?在$i中有什么?整个模式?需要更多详细信息。匹配项的出现次数$例如,我可能是1,正则表达式需要找到1的出现,并用$r替换它@willm1字符串出现的次数。似乎无法使其正常工作?我确信这可能是我的错误。它仍然需要对$output执行一些操作。这个任务的另一个选择是
preg\u split
preg\u split\u DELIM\u CAPTURE
可能(但更精细一些)。我认为这两个函数需要包装在一个类中(作为方法)才能工作。这似乎不能工作吗?我确信这可能是我的错误。它仍然需要对$output执行一些操作。这个任务的另一个选择是
preg\u split
preg\u split\u DELIM\u CAPTURE
可能(但更精细)。我认为这两个函数需要包装在一个类中(作为方法)才能工作。