我正在开发一个项目,该项目从文件夹中获取文本文件,并在每个文件的文本中搜索与图像文件相对应的特定关键字,我尝试使用 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;
}
}
如果
$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
也是无用的,但那是另一个故事了!
您正在嵌套循环内构建
$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
}