我正面临一些php regex的问题,但经过多次研究(条件正则表达式,子模式正则表达式)后,我仍然无法解决它。
我有一个包含许多图像的文件夹,基于变量值,我必须转到该文件夹并选择与该值匹配的所有图像。 例如:在我的文件夹中,我有3张图片:
p102.jpg ; p1020.jpg ; p102_1.jpg;
我只想要正则表达式选择:
p102.jpg ; p102_1.jpg
但正如下面的正则表达式选择所有3张图片。
$image_to_find = 102;
$path = "[^\d]*.*/"
$test = "/^[a-zA-Z]?$image_to_find".$path;
foreach(glob($file_directory) as $file){
if(preg_match($test, $file)){
match[]= $file;
}
}
我也试试:
$path = "(?:\_[0-9]?).*/"; (it selects only p102_1.jpg)
你能帮我解决一下吗?谢谢 (对不起英语)
答案 0 :(得分:2)
如果使用glob模式,可以避免使用foreach循环:
$num = 102;
$result = glob($path . '[a-zA-Z]' . $num . '[._]*');
注意:如果您需要允许多种不同的格式,可以使用array_merge
和几种glob模式:array_merge(glob(...), glob(...));
如果您想要第一个字母可选:
$result = array_merge(
glob($path . $num . '[._]*jpg'),
glob($path . '[a-zA-Z]' . $num . '[._]*jpg')
);
或更好,使用大括号选项:
$result = glob($path . '{[a-zA-Z],}' . $num . '[._]*jpg', GLOB_BRACE);
这比组合" foreach / preg_match"更好。 (或preg_grep
)如果文件名不太复杂。
使用preg_grep
:
$pattern = '~(?:^|/)[a-z]?' . $num . '(?:_\d+)?\.jpg$~i';
$result = preg_grep($pattern, glob($path . '*' . $num . '*.jpg'));
答案 1 :(得分:1)
答案 2 :(得分:0)
未经测试,应该有效。
$find = 102;
$pattern = "/p". $find ."(?:_\d+)?\.jpg/";
$list = array();
foreach (glob($file_directory) as $file)
{
if (preg_match($pattern, $file))
{
$list[] = $file;
}
}
正则表达式:http://regexr.com/3bp29
答案 3 :(得分:-1)
经过测试和工作:
<?php
$image_to_find = 102;
$pattern = '[a-zA-Z]' . $image_to_find . '[._]*';
$path = '/your_folder/your_subfolder/';
$file_directory = glob($path . $pattern );
echo '<pre>';
var_dump($file_directory);
echo '</pre>';
exit();
我希望这有帮助!