

新闻资讯
技术教程str_replace、preg_replace 不赋值则无效,rename在Windows下需UTF-16LE编码;所有替换操作必须接收返回值、验证前置条件、检查系统编码与权限。
PHP 的 str_replace() 不会修改原字符串,而是返回新字符串。不接收返回值,就等于什么都没做。
$text = "file.txt"; str_replace(".txt", ".php", $text); → $text 仍是 "file.txt"
$text = str_replace(".txt", ".php", $text);
$files = str_replace([".jpg", ".png"], [".webp", ".avif"], $files);
正则替换失败往往不是匹配逻辑错,而是语法或赋值疏漏。比如用竖线 | 作分隔符却忘了转义特殊字符,或压根没接返回值。
$pattern = "|[a-z]+\.[a-z]+|"; preg_replace($pattern, "$0", $str); → $str 没变$str = preg_replace($pattern, "$0", $str);
$pattern = '/\.(txt|log)$/i';(推荐用斜杠,更直观)在 Windows 系统中,rename() 对 UTF-8 编码的文件名(如含土耳其语、阿拉伯语、中文)大概率失败,报错 The system cannot find the path specified。
iconv("UTF-8", "UTF-16LE", $filename) 转换路径后再调用 rename()
copy($old, $new) && unlink($old),并检查每步返回值urlencode() —— 它编码的是 URL 路径,不是文件系统路径无论用 str_replace 改字符串,还是 rename 改磁盘文件,失败常源于同一类低级但致命的假设。
"data/file.txt" 却没确认当前工作目录(getcwd() 查看),建议统一用 __DIR__ . '/data/file.txt'
rename("old.txt", "new.txt") 前不检查 file_exists("old.txt"),直接静默失败rename() 都会返回 false,但很多人不检查返回值str_replace("", "x", $s) 永远无效 —— PHP 不允许用空字符串做搜索项
查返回值、没验证前置条件、或在错误的编码层面上操作路径。尤其当文件名走出 ASCII 范围,问题就从逻辑层下沉到系统 API 层——这时候,var_dump(iconv("UTF-8", "UTF-16LE", $name)) 比任何文档都管用。