有条件的正则表达式php

时间:2015-09-11 16:24:58

标签: php regex

我正面临一些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)

你能帮我解决一下吗?谢谢 (对不起英语)

4 个答案:

答案 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)

试试这个:

/p102[_\.]\d*\.?jpg/g

https://regex101.com/r/hM4oE0/1

p102应该是你的'image_to_find'var。

答案 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();

我希望这有帮助!