PHP preg_replace限制不起作用?

时间:2014-04-29 18:55:00

标签: php preg-replace limits

我有一个文件,其中包含十六进制的几种颜色(即#000或#ffffff),我试图用@varN替换每个颜色,其中N是一个数字,每次更换都会增加。我相信我的代码会这样做,但$count总是在完成放置后返回196,即使我将限制设置为1,因此计数永远不会超过1.这会产生无限循环。为什么不是限制工作以及我能做些什么来获得所需的输出?

$list = file($filepath.$file, FILE_USE_INCLUDE_PATH);
$pattern = "/#((([a-f]|[A-F]|[0-9]){6})|(([a-f]|[A-F]|[0-9]){3}))/";
$replaceVar = "@var";
$replaceNum = 0;
$count = 1;
while($count != 0){ //never ends
    $replacement = $replaceVar.$replaceNum;
    $output = preg_replace($pattern,$replacement,$list,1,$count);
    $replaceNum++;
    echo $replaceNum." ".$count."\n"; //returns $replaceNum and 196
}
file_put_contents($filepath.'/new'.$file,$output,FILE_USE_INCLUDE_PATH);

示例输入文件:

  #000000      #111111      #123456      #abcdef      #123      #abc

示例输出文件:

  

@ var1的   @ VAR2   @ VAR3   @ VAR4   @ VAR5   @ var6

2 个答案:

答案 0 :(得分:1)

由于多种原因,你没有使用好的功能,我建议你改用preg_replace_callback。例如:

$source = file_get_contents($yourfile);

$pattern = '~#[[:xdigit:]]{3}(?:[[:xdigit:]]{3})?~';
$count = 0;

$output = preg_replace_callback($pattern,
                       function ($m) use (&$count) { return '@var' . ++$count; },
                                $source);

答案 1 :(得分:1)

您总是替换$list,但将替换结果写入$output

$output = preg_replace($pattern,$replacement,$list,1,$count);

这意味着,$list始终包含1匹配,当它以1开头时 - 它永远不会被修改。因此,你的生活将无止境地运行。您必须在扫描更多匹配的相同字符串内更换它:

$list = preg_replace($pattern,$replacement,$list,1,$count);

现在 - 在某个时刻 - $count应该变为零,$list不再包含不需要的匹配。