我有这样的文件,我正在尝试替换文件:
的abc.txt
# Define the right-hand side of the equation:
#{xvalue1#}xval1= ;#xvalue1
#{xvalue2#}xval2= ;#xvalue2
我所做的如下:
$myfile = fopen("abc.txt", "r") or die("Unable to open file!");
$data = fread($myfile,filesize($pgm_file));
function get_string_between($string, $start, $end){
$string = " ".$string;
$ini = strpos($string,$start);
if ($ini == 0) return "";
$ini += strlen($start);
$len = strpos($string,$end,$ini) - $ini;
return substr($string,$ini,$len);
}
$parsed0 = get_string_between($data, "#{xvalue1#}xval1=", ";#xvalue1");
$parsed1 = get_string_between($data, "#{xvalue2#}xval2=",";#xvalue2");
我正在尝试按如下方式替换值:
$datanew0 = str_replace($parsed0,"5", $data);
$datanew1 = str_replace($parsed1,"10", $datanew0);
当我回应echo $datanew1;
时
我输出为:
# Define the right-hand side of the equation:
#{xvalue1#}xval1= 5;#xvalue1
#{xvalue2#}xval2= 5;#xvalue2
我的预期结果是:
# Define the right-hand side of the equation:
#{xvalue1#}xval1= 5;#xvalue1
#{xvalue2#}xval2= 10;#xvalue2
答案 0 :(得分:1)
我建议宁愿使用字符串中的位置而不是提取和替换内容。
看一下这个例子
function injectBetween($what, $start, $end, $src){
$lpos = strpos($src, $start);
$rpos = strrpos($src, $end);
return substr($src, 0, $lpos + strlen($start)) . $what . substr($src, $rpos);
}
var_dump(injectBetween('test', 'start', 'end', 'startend'));
会给你string 'starttestend' (length=12)
或者匹配您的示例:
var_dump(injectBetween('5', '#{xvalue1#}xval1= ', ';#xvalue1', '#{xvalue1#}xval1= ;#xvalue1'));
我不知道您的完整输入是什么样的。如果您有多条具有相同模式的行,则很可能会失败。在这种情况下更好地使用正则表达式或逐行解析输入(使用explode()
)。
答案 1 :(得分:0)
为什么不使用 RegEx ?它更合适,更有效,更易于实施:
<?php
$subject = "#{xvalue1#}xval1= 19;#xvalue1";
$pattern = "/#\{xvalue[0-9]+#\}xval[0-9]+= ([0-9]+);#xvalue[0-9]+/";
preg_match_all($pattern, $subject, $matchs);
var_dump($matchs);
修改强> 我建议你改变你的模式:
#{xvalue#}xval1= ;#xvalue
RegEx 模式将是:
$pattern = "/#\{xvalue#\}xval([0-9]+)= ([0-9]+);#xvalue/";
请注意,我还捕获了与您的值相关联的密钥