Regex не возвращает правильное значение - PullRequest
0 голосов
/ 14 июня 2019

У меня есть папка, которую я сканирую на php-странице, вводя все имена файлов (и имена каталогов) в массив, называемый struct, который я затем должен проанализировать и проверить две вещи:

1) если имя файла совпадает с шаблоном из 5-8 строчных букв, за которыми следует знак подчеркивания, два числа и заканчиваются расширением .jpg, для которого я пытался использовать

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

2) получить номер из имени файла и передать его как int, для которого я попытался использовать

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

Первый шаблон , кажется, работает, даже когда вызывается с

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

но пытаюсь получить номера файлов с

$temp[] = preg_grep($getnumber, $struct);
print_r($temp);

возвращает 1 в каждом элементе. Как я могу получить фактическое число внутри имени файла?

Это только вершина айсберга, его необходимо координировать с другими системами, поэтому использование чего-то простого, например, взрыва, не годится для текущей установки по разным причинам (главным из которых является то, что Босс сказал так ). Мой текущий опыт регулярных выражений - 4 часа Google-фу, поэтому ЛЮБАЯ помощь будет признательна.

Ответы [ 2 ]

1 голос
/ 14 июня 2019

Вы можете сделать это с помощью одного выражения, используя группу захвата, которая позволяет вам извлечь этот подшаблон. Если у вас более одной группы захвата, она будет индексировать их в порядке их определения. Ссылка на функцию .

Вам также понадобится привязать ваш шаблон, поскольку имя файла с 11 строчными буквами содержит от 5 до 8 символов (в любом случае, в части строки).

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

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

Демо

0 голосов
/ 14 июня 2019

Здесь мы просто используем простую группу захвата в вашем исходном выражении,

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

, и наш желаемый результат находится в $1.

Демо

Тест

$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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...