正则表达式未返回正确的值

时间:2019-06-14 19:01:48

标签: php regex

我有一个文件夹,该文件夹在php页面中扫描,将所有文件名(和目录名)引入名为struct的数组中,然后我必须对其进行分析和检查两件事:

1)如果文件名匹配5到8个小写字母,后跟和下划线,两个数字并以.jpg扩展名结尾的模式,那么我尝试使用

UIView.animate(withDuration: 1.0, delay: 0.0, options: .allowUserInteraction, animations: { //animate here })

2)从文件名获取数字并将其作为整数传递,我尝试使用

$pattern = '~[a-z]{5,8}_\d{1,2}\.jpg~';

即使被

调用,第一个模式似乎也可以起作用

$getnumber = '~(?<=_)\d+(?=\.)~';

但尝试获取文件号

if ((preg_match($pattern, $entry) === 0) && (!in_array($entry, $wrongformat)))

在每个元素中返回1。如何在文件名中获取实际编号?

这只是冰山一角,它需要与其他系统配合使用,因此使用诸如explode这样的简单操作在当前设置中不可用,出于各种原因(其主要原因是Boss这样说。 )。我目前的正则表达式经验是4个小时的Google-fu,因此将不胜感激。

2 个答案:

答案 0 :(得分:1)

您可以通过使用捕获组使用单个表达式来执行此操作,从而允许您提取该子模式。如果您有多个捕获组,它将按定义顺序对它们进行索引。 Function reference

您还需要锚定样式,因为文件名中包含11个小写字母 介于5到8个字符之间(无论如何是字符串的一部分)。

$pattern = '/^[a-z]{5,8}_(\d{1,2})\.jpg$/';

if (preg_match($pattern, $entry, $matches)) {
    $number = $matches[1];
}

Demo

答案 1 :(得分:0)

在这里,我们仅在原始表达式中使用一个简单的捕获组,

([a-z]{5,8}_\d{1,2})\.jpg

,我们期望的输出在$1中。

Demo

测试

$re = '/([a-z]{5,8}_\d{1,2})\.jpg/m';
$str = 'aaaaa_11.jpg
aaaaa_11.jpeg';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

var_dump($matches[0][1]);

输出

aaaaa_11