我想在下面的脚本中添加一个正则表达式过滤器(就在array_push之前),这样当它遇到具有相同前缀“_filename”且其中一个匹配项为“-150x150”的文件时。在文件名的末尾,它会推送该图像并使用相同的前缀跳过其他图像。
但是,如果该集合中没有图像具有“-150x150”。在文件名中,它选择具有根前缀(_filename.ext)
的图像例如,如果以下文件驻留在$ dir文件夹中:
_file.png
_file-150x150.png
_file-200x300.png
_someImage.png
_myfile.jpg
_myfile-200x200.jpg
我希望将_file-150x150.png,someImage.png和myfile.jpg推送到数组中,然后跳过其他数据。
$dir = 'wp-content/uploads/';
if(!is_dir($dir)){return;}
$url = get_bloginfo('url').'/wp-content/uploads/';
$imgs = array();
if ($dh = opendir($dir))
{
$myfilter="";
while (($file = readdir($dh)) !== false)
{
if (!is_dir($file)&& $file != "." && $file != ".." && preg_match("/^[".$myfilter."_].*\.(bmp|jpeg|gif|png|jpg)$/i", $file))
{
array_push($imgs, $file);
}
}
closedir($dh);
} else {
die('cannot open ' . $dir);
}
if($imgs)
{
sort($imgs);
echo '<div>';
foreach ($imgs as $idx=>$img)
{
$class = ($idx == count($imgs) - 1 ? ' class="last"' : '');
echo $prelink.' src="' . $url . $img . '" alt="' .$img . '"' . $class . ' />'.$postlink;
}
echo '</div>';
}
答案 0 :(得分:0)
我会这样做:
将所有文件名与(.*?)(\-\d+x\d+)?(\.\w+)
匹配,并提取$1
作为基本名称,$2
作为可选解决方案,{{1} }作为后缀;
浏览唯一的基本名称,并检查是否存在所需的分辨率。
答案 1 :(得分:0)
我发现这样做的最简单方法是将基本文件名和包含150x150的文件添加到关联数组中,并将键作为基本文件名。然后,使用名称中包含150x150的文件覆盖现有值。
$files = array(
'_file.png',
'_file-150x150.png',
'_file-200x300.png',
'_someImage.png',
'_myfile.jpg',
'_myfile-200x200.jpg'
);
$found = array();
foreach ($files as $file ) {
if (preg_match('/(_[^-]*)(-150x150)?\.(\w+)/', $file, $matches)) {
$base = $matches[1];
if (isset($found[$base]) && strstr($found[$base],'150x150')) {
continue;
} else {
$found[$base] = $matches[0];
}
}
}
结果var_dump($found)
array
'_file' => string '_file-150x150.png' (length=17)
'_someImage' => string '_someImage.png' (length=14)
'_myfile' => string '_myfile.jpg' (length=11)
抱歉,我没有使用您的代码。我认为你有足够的经验来整合自己。如果您需要进一步解释如何适应您的需求,请告诉我。
答案 2 :(得分:0)
假设150x150文件名总是在基类之后,这里有一个你可以使用的正则表达式:
/^([^-.]+)(?:-150x150)?\.png\b(?!.*\1-150x150\.png\b)/ms
说明:
/
^ #Match the start of the line
([^-.]+) #Match the first part of the file before the -sizeXsize
#And store it in the first capturing group.
(?:-150x150)? #Match 0 or 1 of the desired size.
#(?:) is so that you don't store this match.
\.png\b #followed by .png
(?!.*\1-150x150\.png\b) #A negative look ahead for the desired resolution.
#i.e. don't match the base if the desired resolution exists.
/ms #m is for multiline so that the ^ means start of line rather than start of string.
#s is for dotall so that the .* in the lookahead can match newlines.
结果将是这样的:
Array
(
[0] => Array
(
[0] => _file-150x150.png
[1] => _someImage.png
)
[1] => Array
(
[0] => _file
[1] => _someImage
)
)