我有一个表单,我从输入框中获取文件名。我创建了一个目录并更改了扩展表单" gpx" to" xml"在我将文件上传到我的目录之前的文件。 在php5中我需要preg_replace,但在php中我不能再这样做了。
我有这个代码: 我的旧代码是:
if (!file_exists($dirPath)) {
mkdir($dirPath, 0755,true);
}
$target = '/'.$mappe.'/';
$target = $dirPath .'/'. basename( $_FILES['gpsfilnavn']['name']);
$target = preg_replace("/(\w+).gpx/ie","$1.'.xml'",$target);
$xmlfil = $xmlfil . basename( $_FILES['gpsfilnavn']['name']);
$xmlfil = preg_replace("/(\w+).gpx/ie","$1.'.xml'",$xmlfil);
if(move_uploaded_file($_FILES['gpsfilnavn']['tmp_name'], $target)) {
echo "The file ". basename( $_FILES['gpsfilnavn']['name'])." has been uploaded";
任何人都可以帮助我改变我的想法吗?
答案 0 :(得分:0)
答案 1 :(得分:0)
今天我将基于phpBB的网站从PHP5升级到PHP7时偶然发现了这个问题。我提出了三种不同的解决方法,可用于不同的场景,第二种是我唯一可行的解决方案,因为我在文件系统/ db中存储了基于模板的regexp而不是静态的,我无法做到这一点。容易改变。
基本上,我离开了这个:
$input = preg_replace($search, $replace, $input);
这样的事情:
$input = preg_replace($search,
function($m) use ($replace) {
$rep = $replace;
for ($i = 1; $i<count($m); $i++) {
$rep = str_replace('\\'.$i, '$m['.$i.']', $rep);
$rep = str_replace('\$'.$i, '$m['.$i.']', $rep);
}
eval('$str='.$rep);
return $str;
},
$input);
毋庸置疑,这只不过是一个快速而肮脏的解决方法,只有&#34;可行的&#34;对于那些无法使用更新的 preg_replace_callback 函数轻松重构代码的用户而不必使用任何可能不安全的eval()
调用:出于这个原因,只有在开发人员完全控制时才应使用它替换字符串/规则,并能够正确地测试/调试它们。也就是说,在我的具体情况下,我能够有效地使用它来完成工作。
重要提示: str_replace
和/或eval()
可能会破坏一些替换规则,除非它们是&#34;正确&#34;定义考虑上述代码。
有关此问题和其他替代解决方法的详细信息,您还可以在我的博客上阅读this post。