字符$ 00,$ 11等被preg_replace错误地替换

时间:2012-03-09 02:49:51

标签: php regex

在一个简单的模板解析器中,$00$11等位于HTML中,它将被删除。我没有看到我的模式中有什么因为更换而导致10美元被剥夺。

奇怪的是,除了处理标记的主preg_replace函数之外,我几乎已经注释掉了所有代码。似乎没有联系,但几乎所有其他东西都被删除了。

功能(未显示已注释的内容):

public function output() {
    $output = file_get_contents($this->file);

    foreach ($this->values as $key => $value) {
        $dynamic = preg_quote($key);
        $pattern = '%\[@'.$dynamic.'.*?\]%';
        $output  = preg_replace($pattern, $value, $output);     

        if ($key == 'objective') {
            $objective = $value;
        }
    }
}

HTML摘录

[if @objective]<div id="objective">[@objective]</div>[/if]

'客观'的原始价值(即$value):

  

在XYZ公司获得一个职位,$ 100美元!100最大化我的管理技能,质量保证,项目开发和培训经验。

'目标'的新价值

  

在XYZ公司获得一个职位,其中$ words 0!100最大化我的管理技能,质量保证,项目开发和培训经验。

2 个答案:

答案 0 :(得分:2)

(对问题发表评论的后续行动。)

$xx(其中x是一个数字)用于preg_replace的替换字符串中的反向引用。如果您希望替换字符串包含$xx,则必须将其转义:

$value = preg_replace('/\\$\\d+/', '\\\\$0', $value);

这会将$xx替换为\$xx中的$value

答案 1 :(得分:1)

这种情况正在发生,因为在preg_replace中,替换字符串中的$<number> 表示“替换为模式中的'th捕获括号”。

你必须告诉PHP忽略'$'符号。我认为你必须分两步完成这个过程:

  1. str_replace("$","\\\$",$output); - 通过预先加上反斜杠来保护美元符号
  2. preg_replace($pattern,$value,$output);