PHP在代码中找到数字,在第二次搜索时跳过第一个数字?

时间:2014-08-18 15:11:33

标签: php string preg-match

我目前正在研究一些小代码,因为我的一所大学“销毁”了xml文档。我想在文档中找到所有y =“\ d +”并将数字增加+3。我的尝试是这样的:

$path_to_file = 'testing.xml';
$file_contents = file_get_contents($path_to_file);
if(preg_match('/y="\d+"/', $file_contents, $bef)){
    $length = count($bef);
    for($i=0; $i<$length; $i++){
        if($bef[$i]!=0){
            $file_contents = str_replace($bef[$i], 'y="'. $bef[$i]+3 .'"', $file_contents);
        }
    }
    file_put_contents($path_to_file,$file_contents);
}
else{
    echo 'not found';   
}

它似乎找到了文档中的第一个数字,但我无法弄清楚如何搜索2.,3。等。有什么资源可以给我,我可以找到解决问题的方法?

编辑:

显示我的问题:

我有xml代码,例如“&lt; graphic-area y =”125“x =”324“width =”bla“height =”bla“&gt;&lt; / graphic-area&gt;”等等。代码是后来生成了.pdf文件。所以我的大学没有添加修剪到网站,所以每个y属性,除了y =“0”是3毫米太低。我们有60多页,可以说有400多个具有y属性的区域。所以我需要一个PHP代码来修复y属性。 这个解决方案工作正常,没有'25 .2'数字,因此没有带点的数字。解决方法是使用两种不同的模式,然后在点之前获取数字并增加它。这是没有“253.2232”解决方案的最佳答案的代码。

$path_to_file = 'testing.xml';
$file_contents = file_get_contents($path_to_file);

$pattern = '/y="(\d+)"/';
$new_contents = preg_replace_callback($pattern, 'add_three', $file_contents);

file_put_contents($path_to_file,$new_contents);

function add_three($matches){
    return 'y="' . (3 + (int)$matches[1]) . '"';
}

希望它有助于某人

2 个答案:

答案 0 :(得分:1)

$path_to_file = 'testing.xml';
$file_contents = file_get_contents($path_to_file);

$pattern = '/y="(\d+\.?\d*)"/'; // Optional dot follower by optional digits
$new_contents = preg_replace_callback($pattern, 'add_three', $file_contents);

file_put_contents($path_to_file,$new_contents);

function add_three($matches){
    return 'y="' . (3 + (float)$matches[1]) . '"'; // Cast to float not int, since we can do floats too
}

这将使add_three在文档中匹配。

答案 1 :(得分:0)

您需要使用preg_match_all,因为preg_match仅返回10false

因此:

if (preg_match_all('/y="\d+"/', $file_contents, $matches)) {
    foreach ($matches as $match) {
        // $match will contain information about the current match
    }
}