符号问题(scandir、array_diff、foreach)
problems with symbols (scandir, array_diff, foreach)
我正在尝试编写一个脚本来打开目录,扫描所有文件(图像)并将其显示在屏幕上,但问题是,它的名称中包含符号,而 scandir 无法处理它。
名称中没有符号的目录没问题,脚本运行完美,但是名称中有符号的 directories/files 是个大问题。
例如,我共有 2 个目录,该目录中的所有文件的名称中都包含相同的符号。一个包含“®”,另一个包含“™”,每个文件(图像)的名称中都有这些符号,例如:"Right® screen452217.jpg"。因此,重命名目录和文件不是一种选择,这会花费太多时间。
也许有更好的方法,但我直接从屏幕上的 url 使用 $_GET 进行。它现在在本地服务器上,我在 VertrigoServ WAMP 服务器上工作,然后脚本看起来像:
http://127.0.0.1/screenshots/index.php?page=Rights®
http://127.0.0.1/screenshots/index.php?page=Trade%20Marks™
$url = "screens/".$_GET["page"]."";
$scan = scandir($url, SCANDIR_SORT_NONE);
$scaned = array_diff($scan, array('.', '..', 'Thumbs.db'));
foreach($scaned as $shots) {
if ($shots <> "thumbnails") {
echo "<li>".PHP_EOL.
" <img width=\"253\" height=\"158\" src=\"".$url."\".$shots."\"".
" alt=\"".$shots."\" title=\"".$shots."\".
" </li>".PHP_EOL.PHP_EOL;
}
}
scandir 报告这些错误:
The system cannot find the file specified. (code: 2)
failed to open dir: No such file or directory
No such file or directory
array_diff 报告此错误:
Argument #1 is not an array
最后是 foreach 报告:
Invalid argument supplied for foreach()
我也尝试用 mb_convert_encoding() and iconv() 更改编码,但没有成功。
我最好的结果是在更改 url 之后,我使用 windows-1252 ASCII Encoding Reference:
而不是使用“®”或“™”
http://127.0.0.1/screenshots/index.php?page=Rights%AE
http://127.0.0.1/screenshots/index.php?page=Trade%20Marks%99
然后一切顺利通过,但是 "img src" 没有显示图像,而是像:
screens/Rights�\Right�452217.jpg
还是有问题,因为图片不显示。我喜欢坚持使用 scandir,因为我已经完成了页面,但我无法通过符号解决这个问题。你能帮帮我吗?
其实比我想象的要简单。问题是,该目录的名称中已经包含符号,因此我必须将其更改为 Windows-1252,如下所示:
$page = $_GET["page"];
if (strpos($page, '®')) {$page = str_replace('®', '%AE', $page);}
if (strpos($page, '™')) {$page = str_replace('™', '%99', $page);}
然后网址从:
http://127.0.0.1/screenshots/index.php?page=Rights®
http://127.0.0.1/screenshots/index.php?page=Trade%20Marks™
收件人:
http://127.0.0.1/screenshots/index.php?page=Rights%AE
http://127.0.0.1/screenshots/index.php?page=Trade%20Marks%99
然后就简单了,在scandir后面加一个编码,在foreach中加一个:
$url = "screens/".$_GET["page"]."";
$scan = scandir($url, SCANDIR_SORT_NONE);
$scaned = array_diff($scan, array('.', '..', 'Thumbs.db'));
$url = iconv("windows-1252", "UTF-8", $screen_uplay);
foreach($scaned as $shots) {
if ($shots <> "thumbnails") {
$shots = iconv("windows-1252", "UTF-8", $shots);
echo "<li>".PHP_EOL.
" <img width=\"253\" height=\"158\" src=\"".$url."\".$shots."\"".
" alt=\"".$shots."\" title=\"".$shots."\".
" </li>".PHP_EOL.PHP_EOL;
}
}
就这么简单。也许有更好的方法,但这对我有用,我同意。
我正在尝试编写一个脚本来打开目录,扫描所有文件(图像)并将其显示在屏幕上,但问题是,它的名称中包含符号,而 scandir 无法处理它。
名称中没有符号的目录没问题,脚本运行完美,但是名称中有符号的 directories/files 是个大问题。
例如,我共有 2 个目录,该目录中的所有文件的名称中都包含相同的符号。一个包含“®”,另一个包含“™”,每个文件(图像)的名称中都有这些符号,例如:"Right® screen452217.jpg"。因此,重命名目录和文件不是一种选择,这会花费太多时间。
也许有更好的方法,但我直接从屏幕上的 url 使用 $_GET 进行。它现在在本地服务器上,我在 VertrigoServ WAMP 服务器上工作,然后脚本看起来像:
http://127.0.0.1/screenshots/index.php?page=Rights®
http://127.0.0.1/screenshots/index.php?page=Trade%20Marks™
$url = "screens/".$_GET["page"]."";
$scan = scandir($url, SCANDIR_SORT_NONE);
$scaned = array_diff($scan, array('.', '..', 'Thumbs.db'));
foreach($scaned as $shots) {
if ($shots <> "thumbnails") {
echo "<li>".PHP_EOL.
" <img width=\"253\" height=\"158\" src=\"".$url."\".$shots."\"".
" alt=\"".$shots."\" title=\"".$shots."\".
" </li>".PHP_EOL.PHP_EOL;
}
}
scandir 报告这些错误:
The system cannot find the file specified. (code: 2)
failed to open dir: No such file or directory
No such file or directory
array_diff 报告此错误:
Argument #1 is not an array
最后是 foreach 报告:
Invalid argument supplied for foreach()
我也尝试用 mb_convert_encoding() and iconv() 更改编码,但没有成功。
我最好的结果是在更改 url 之后,我使用 windows-1252 ASCII Encoding Reference:
而不是使用“®”或“™”http://127.0.0.1/screenshots/index.php?page=Rights%AE
http://127.0.0.1/screenshots/index.php?page=Trade%20Marks%99
然后一切顺利通过,但是 "img src" 没有显示图像,而是像:
screens/Rights�\Right�452217.jpg
还是有问题,因为图片不显示。我喜欢坚持使用 scandir,因为我已经完成了页面,但我无法通过符号解决这个问题。你能帮帮我吗?
其实比我想象的要简单。问题是,该目录的名称中已经包含符号,因此我必须将其更改为 Windows-1252,如下所示:
$page = $_GET["page"];
if (strpos($page, '®')) {$page = str_replace('®', '%AE', $page);}
if (strpos($page, '™')) {$page = str_replace('™', '%99', $page);}
然后网址从:
http://127.0.0.1/screenshots/index.php?page=Rights®
http://127.0.0.1/screenshots/index.php?page=Trade%20Marks™
收件人:
http://127.0.0.1/screenshots/index.php?page=Rights%AE
http://127.0.0.1/screenshots/index.php?page=Trade%20Marks%99
然后就简单了,在scandir后面加一个编码,在foreach中加一个:
$url = "screens/".$_GET["page"]."";
$scan = scandir($url, SCANDIR_SORT_NONE);
$scaned = array_diff($scan, array('.', '..', 'Thumbs.db'));
$url = iconv("windows-1252", "UTF-8", $screen_uplay);
foreach($scaned as $shots) {
if ($shots <> "thumbnails") {
$shots = iconv("windows-1252", "UTF-8", $shots);
echo "<li>".PHP_EOL.
" <img width=\"253\" height=\"158\" src=\"".$url."\".$shots."\"".
" alt=\"".$shots."\" title=\"".$shots."\".
" </li>".PHP_EOL.PHP_EOL;
}
}
就这么简单。也许有更好的方法,但这对我有用,我同意。