我在 PHP 中有以下函数,除了名称中带有空格的文件(例如
Good picture.jpg
)之外,该函数运行良好。 在这里:
function getphotolist($currentalbum) {
$photos = glob($currentalbum.'/*.[Jj][Pp][Gg]');
$albumparts = explode('_', $currentalbum);
switch (array_key_exists(2,$albumparts)) {
case false:
usort($photos,"cmpexiftime");
break;
case true:
usort($photos,"cmpexiftimer");
break;
}
$photolist = "";
foreach($photos as $photo){
$phototitle = explode('_',basename($photo,".jpg"));
$title = $phototitle[0];
$thumb = $currentalbum.'/thumbs/'.basename($photo,".jpg").'_thumb.jpg';
$exif = read_exif_data_raw("$photo",0);
$desc = $exif["IFD0"]["ImageDescription"];
$camera = ucwords(strtolower($exif["IFD0"]["Model"]));
switch($exif["SubIFD"]["LensInfo"]) {
case "105.0 mm f/2.8":
$lens = "AF-S Micro-Nikkor 105mm ƒ/2.8 VR";
break;
case "50.0 mm f/1.8":
if ($camera=="Nikon D700") {
$lens = "AF-S Nikkor 50mm ƒ/1.8 G";
} else {
$lens = "AF Nikkor 50mm ƒ/1.8 D";
}
break;
case "18.0-55.0 mm f/3.5-5.6":
$lens = "AF-S Nikkor 18-55mm ƒ/3.5-5.6 II";
break;
default:
$lens = $exif["SubIFD"]["LensInfo"];
break;
}
$length = str_replace(" ","",$exif["SubIFD"]["FocalLength"]);
$shutter = str_replace(" ","",str_replace("ec","",$exif["SubIFD"]["ShutterSpeedValue"]));
$aperture = str_replace("f","ƒ",$exif["SubIFD"]["ApertureValue"]);
$iso = $exif["SubIFD"]["ISOSpeedRatings"];
list($width,$height) = getimagesize($photo);
if ($height==1080 && $width==1920) {
$photolist .= '<span data-title="'.$title.'" data-thumb="'.$thumb.'" data-desc="'.$desc.'" data-camera="'.$camera.'" data-lens="'.$lens.'" data-length="'.$length.'" data-shutter="'.$shutter.'" data-aperture="'.$aperture.'" data-iso="'.$iso.'" style="background-image:url('.$photo.'); background-size:cover;" class="slide"></span>';
} elseif ($height >= $width) {
$photolist .= '<span data-title="'.$title.'" data-thumb="'.$thumb.'" data-desc="'.$desc.'" data-camera="'.$camera.'" data-lens="'.$lens.'" data-length="'.$length.'" data-shutter="'.$shutter.'" data-aperture="'.$aperture.'" data-iso="'.$iso.'" style="background-image:url('.$photo.'); background-size:contain;" class="slide"></span>';
} else {
$photolist .= '<span data-title="'.$title.'" data-thumb="'.$thumb.'" data-desc="'.$desc.'" data-camera="'.$camera.'" data-lens="'.$lens.'" data-length="'.$length.'" data-shutter="'.$shutter.'" data-aperture="'.$aperture.'" data-iso="'.$iso.'" style="background-image:url('.$photo.'); background-size:contain;" class="slide"></span>';
}
}
return $photolist;
}
任何人都可以建议如何修复此问题以处理带空格的文件吗? 谢谢!
在使用 glob 时尝试使用此代码转义文件名中的空格:
$albumEscaped = str_replace(' ', '\ ', $currentalbum);
$photos = glob($albumEscaped .'/*.[Jj][Pp][Gg]');
空格不是使用 glob() 时唯一必须转义的字符。
复制自PHP 文档评论:
我终于找到了转义 glob() 中内容的正确方法 如果您想在模式之前添加目录路径,您应该这样做 像这样:
<?php glob(preg_replace('/(\*|\?|\[)/', '[$1]', $dir_path).'*.txt'); ?>
preg_quote 不适用于所有情况(如果有)。
根据 bug 75959,如果您需要 glob 的一部分按字面匹配,例如路径前缀,至少用
quotemeta()
对其进行转义。
下面的函数是语义函数,如果在 GLOB_BRACE
调用中使用 glob()
标志,则可以执行所需的额外转义。
function glob_quote(string $literal, bool $braces = false): string
{
$escaped = quotemeta($literal);
if ($braces) {
$escaped = addcslashes($escaped, '{}');
}
return $escaped;
}