我有一个文件,其中包含十六进制的几种颜色(即#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
答案 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
不再包含不需要的匹配。