替换php中的值不能按预期工作

时间:2015-09-11 15:24:44

标签: php

我有这样的文件,我正在尝试替换文件:

的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

2 个答案:

答案 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/";

请注意,我还捕获了与您的值相关联的密钥