我发现PHP函数basename()以及pathinfo()对于多字节utf-8名称都具有奇怪的行为。它们会删除所有非拉丁字符,直到第一个拉丁字符或标点符号为止。但是,此后,将保留后续的非拉丁字符。
basename("àxà"); // returns "xà", I would expect "àxà" or just "x" instead
pathinfo("àyà/àxà", PATHINFO_BASENAME); // returns "xà", same as above
Run Code Online (Sandbox Code Playgroud)
但奇怪的是pathinfo()的目录名部分工作正常:
pathinfo("àyà/àxà", PATHINFO_DIRNAME); // returns "àyà"
Run Code Online (Sandbox Code Playgroud)
PHP文档警告basename()和pathinfo()函数知道区域设置,但这并不能说明pathinfo(..., PATHINFO_BASENAME)和之间的不一致pathinfo(..., PATHINFO_DIRNAME),更不用说根据它们相对于拉丁语的位置,相同的非拉丁语字符将被丢弃还是被接受的事实。字符。
听起来像是一个PHP错误。
由于“基本名称”检查对于避免直接遍历对安全性而言非常重要,因此是否有任何可靠的基本名称过滤器可以很好地与Unicode输入配合使用?
这是显示问题的一个简单示例:
print basename('léquipe.jpg'); // léquipe.jpg
print basename('équipe.jpg'); // quipe.jpg
Run Code Online (Sandbox Code Playgroud)
如何避免这种不一致,并确保basename()将整个文件名返回给我?
谢谢