preg_quote中的变量在preg_replace_callback中失败

时间:2012-03-03 20:34:45

标签: php regex

在preg_replace_callback中使用变量$ key会失败,但看起来完全相同的文本可以正常工作:"%\[if @$username\](.*?)\[/if\]%"

令人困惑的是我正在使用preg_quote并且模式是双引号。

$ pattern生成%\[if @username\](.*?)\[/if\]%失败(没有错误) 但写在%\[if @username\](.*?)\[/if\]%中工作得很好

public function output() {
if (!file_exists($this->file)) {
    return "Error loading template file ($this->file).<br />";
}
$output = file_get_contents($this->file);

foreach ($this->values as $key => $value) {
    $tagToReplace = "[@$key]";
    $output = str_replace($tagToReplace, $value, $output);
    $regex_key = preg_quote($key);
    $pattern = "%\[if @$regex_key\](.*?)\[/if\]%"; // produces: %\[if @username\](.*?)\[/if\]%
    $output = preg_replace_callback($pattern, array($this, 'if_replace'), $output);
}

return $output;
}

public function if_replace($matches) {

    $matches[0] = preg_replace("%\[if @username\]%", "", $matches[0]);
    $matches[0] = preg_replace("%\[/if]%", "", $matches[0]);
    return $matches[0];
}

2 个答案:

答案 0 :(得分:0)

您可能存在可变范围问题。如果php插入变量名本身而不是它的值,那么php不知道变量。当您在回调方法中使用$ username变量时,您可能必须首先将其声明为全局并通过添加

将其导入方法
global $username;

到if_replace()

答案 1 :(得分:0)

将$ pattern的构造方式更改为下面的代码似乎解决了这个问题:

OLD:

  $pattern = "%\[if @$regex_key\](.*?)\[/if\]%";

NEW:

 $pattern = '%\[if @'.$regex_key.'\](.*?)\[/if\]%';