substr_replace() 调用嵌套循环内的结果字符串会导致替换文本

问题描述 投票:0回答:2

我正在开发一个项目,该项目从文件夹中获取文本文件,并在每个文件的文本中搜索与图像文件相对应的特定关键字,我尝试使用 php 将这些图像文件作为 html 图像标记插入到文本中。

我几乎可以使用了;正确的图像会插入到所需的位置,并且不包含关键字的文本文件保持不变,但插入图像的文本文件会加倍:一个添加了图像的文本文件和一个原始文本文件。

我尝试了不同的方法,但要么根本不起作用,要么插入图像的文本文件是重复的。

问题出在哪里?我是不是走错了路?

这是我的代码:

$path = // array of .txt-filenames with plain tekst
$imagepath = // array of .jpg-filenames

foreach ($path as $file) {

    $haystack = file_get_contents("$file");

    foreach ($imagepath as $imagefile) {
        $needle = $imagefile;
        $position = strpos($haystack,$needle);

        if ($position !== false) {
            $output = substr_replace($haystack, "<img src='$imagefile'>", $position, 0);
        } else {
            $output = $haystack;
        }
        echo $output;
    }
}
php replace
2个回答
0
投票

如果

$imagepath
中有两张图像,并且
strpos
找不到第二张图像,那么我相信
$output = $haystack;
将恢复之前的更改。

这是一个包含更有意义的变量的代码片段。

<?php
$textFiles = [];
$imageFileNames = [];

foreach ($textFiles as $file) {
    $fileContent = file_get_contents($file);

    foreach ($imageFileNames as $imageFileName) {
        $position = strpos($fileContent, $imageFileName);

        if ($position !== false) {
            $fileContent = substr_replace($fileContent, "<img src='$imageFileName' />", $position, 0);
        }
    }
    file_put_contents($file, $fileContent);
    echo $fileContent; // if you want to debug
}

我们可以说,即使

$file
没有改变,我们正在重写
$fileContent
也是无用的,但那是另一个故事了!


0
投票

您正在嵌套循环内构建

$output
字符串,因此每次内部循环重新启动并找到列入白名单的图像文件名(即使是已经受影响的图像文件名)时,都会进行另一个替换。

我建议通过避免嵌套循环来避免这个问题。 构建所有合格图像名称的正则表达式模式,然后在每个迭代文件中进行所有可能的替换。

  • 如果
    $path
    是文件路径数组,则将其称为
    $paths
  • 如果
    $imagepath
    是图像文件名数组,则将其称为
    $imageNames
$piped = implode('|', array_map('preg_quote', $imageNames));
foreach ($paths as $file) {
    echo preg_replace(
             "#$piped#",
             '<img src="$0">$0',
             file_get_contents($file)
         );
    echo "\n---\n"; // create some visual separation between files
}
© www.soinside.com 2019 - 2024. All rights reserved.