0

我有一个复制文件的脚本,但是在复制该文件后,我需要一个脚本来动态更改该文件中的某些字符串值。

通过四处搜索,我发现file_get_contentsstr_replace为此工作得最好,但由于某种原因,我拥有的脚本不起作用。

这就是我所拥有的:(注意:$wikiname 是正在创建的新 wiki 的名称

$template = file_get_contents("/var/www/wiki/". $wikiname ."/LocalSettings.php");

$snReplace = str_replace("templatewiki", $wikiname, $template);
$mnReplace = str_replace("Templatewiki", $wikiname, $template);
$spReplace = str_replace("/iadmin/wikifresh", "/wiki/".$wikiname, $template);
$wgDBname = str_replace("template_wiki", $wikiname, $template);

我正在搜索确切的字符串并尝试用 wiki 名称替换该字符串。但由于某种原因,这根本不起作用。

有没有我遗漏的明显问题?

谢谢

4

3 回答 3

2

str_replace 返回修改后的字符串,作为参数传递的字符串保持不变。这是你需要做的:

$template = file_get_contents("/var/www/wiki/" . $wikiname . "/LocalSettings.php");
$template = str_replace("templatewiki", $wikiname, $template);
$template = str_replace("Templatewiki", $wikiname, $template);
$template = str_replace("/iadmin/wikifresh", "/wiki/" . $wikiname, $template);
$template = str_replace("template_wiki", $wikiname, $template);

您还可以使用strtr函数来实现相同的结果:

$template = strtr(file_get_contents("/var/www/wiki/" . $wikiname . "/LocalSettings.php"), array(
    "templatewiki"      => $wikiname,
    "Templatewiki"      => $wikiname,
    "/iadmin/wikifresh" => "/wiki/" . $wikiname,
    "template_wiki"     => $wikiname
));
于 2012-11-12T17:55:28.447 回答
1

您需要继续将每个替换的输出传递给下一个替换的输入,否则您只是在最终的 str_replace 中进行替换(假设您只在脚本的其余部分使用最后一个变量)。更好的是,您将替换合并到更少的命令中 -

$template = file_get_contents('/var/www/wiki/' . $wikiname . '/LocalSettings.php');
$new = str_replace(array('templatewiki', 'Templatewiki', 'template_wiki'), $wikiname, $template);
$new = str_replace('/iadmin/wikifresh', '/wiki/' . $wikiname, $new);

您甚至可以使用数组作为第二个参数将这两条 str_replace 行合并到一个命令中,但是为了便于阅读,我将它们保留为两个。

您还需要保存输出,一种方法是 -

file_put_contents('/var/www/wiki/' . $wikiname . '/LocalSettings.php', $new);
于 2012-11-12T18:00:38.387 回答
0

尝试:

$template = file_get_contents("/var/www/wiki/". $wikiname ."/LocalSettings.php");
$template = str_replace(array("templatewiki", "Templatewiki","template_wiki","/iadmin/wikifresh"), array($wikiname,$wikiname, $wikiname,"/wiki/".$wikiname), $template);

你不需要使用多个str_replace,你只需要 1。

也可以str_ireplace用于不区分大小写的替换,将参数减1,

$template = str_ireplace(array("templatewiki", "template_wiki","/iadmin/wikifresh"), array($wikiname, $wikiname,"/wiki/".$wikiname), $template);

手册:str_replace str_ireplace

于 2012-11-12T17:58:32.340 回答