2014-10-22 2 views
0

У меня разные версии имен файлов.Как получить номера страниц из примера (с PHP)

Как я могу получить 123.pdf, 124.pdf и 125.pdf? Длина имен файлов может варьироваться, 14-5678 не относится к этому времени и его следует игнорировать.

  • 14-5678_jobname_0123_.p1.PDF
  • 14-5678_jobname_0123_.p2.PDF
  • 14-5678_jobname_0125_.p1.PDF
  • Weired_filename_0123_bla_14-5678_jobname.p1.PDF
  • Weired_filename_0123_bla_14-5678_jobname.p2.PDF
  • Weired_filename_0125_bla_14-5678_jobname.p1.PDF
  • 14-5678_jobname_0123.p1.PDF
  • 14-5678_jobname_0123.p2.PDF
  • 14-5678_jobname_0125.p1.PDF
  • 0123_14-5678_jobname.p1.PDF
  • 0123_14-5678_jobname.p2.PDF
  • 0125_14-5678_jobname.p1.PDF
  • jobname_0123_14-5678.p1.PDF
  • jobname_0123_14-5678.p2.PDF
  • jobname_0125_14-5678.p1.PDF

Пытался в течение нескольких часов с регулярными выражениями тестеров, Я сейчас полностью застрял. Понравился бы какой-то PHP-код, который может выполнять эту работу.

+1

Опубликовать ваши попытки. –

+0

Покажите свои попытки – Sal00m

+0

попробуйте этот http: // stackoverflow.com/questions/4991554/regular-expression-to-get-sub-string-via-php – Arun

ответ

0

Вы должны соответствовать серии из четырех чисел, которые не предшествуют тир:

/[^-](\d{4})/ 

разлагающегося регулярное выражение:

  • [^-]: не прочерк
  • \d{4}: четыре цифры
  • (\d{4}): фиксировать цифры

Затем вы можете добавить .pdf, чтобы получить имя вашего файла.

Пример с preg_replace и имена файлов вы приведенные выше в массиве:

foreach ($files as $f) { 
    echo "$f => " . preg_replace("/.*?[^-]*(\d{4}).+/", "$1.pdf", $f) . PHP_EOL; 
} 

ETA: если вы хотите, чтобы фактор номер страницы, вы можете использовать этот код:

foreach ($files as $f) { 
    # this saves the four digits of the PDF name, and the number in p1/p2 
    preg_match("/.*?[^-]*(\d{4}).*?p(\d+)\.pdf/i", $f, $matches); 
    # if the number (from p1/p2) is greater than 1, add it to the PDF name number 
    if ($matches[2] > 1) { 
     $matches[1] += $matches[2] - 1; 
    } 
    # format the pdf name to be four digits long, with zero padding for shorter names 
    echo "$f => " . sprintf('%04d.pdf', $matches[1]) . PHP_EOL; 
} 

Выход:

14-5678_jobname_0123_.p1.PDF => 0123.pdf 
14-5678_jobname_0123_.p2.PDF => 0124.pdf 
14-5678_jobname_0125_.p1.PDF => 0125.pdf 
Weired_filename_0123_bla_14-5678_jobname.p1.PDF => 0123.pdf 
Weired_filename_0123_bla_14-5678_jobname.p2.PDF => 0124.pdf 
Weired_filename_0125_bla_14-5678_jobname.p1.PDF => 0125.pdf 
14-5678_jobname_0123.p1.PDF => 0123.pdf 
14-5678_jobname_0123.p2.PDF => 0124.pdf 
14-5678_jobname_0125.p1.PDF => 0125.pdf 
0123_14-5678_jobname.p1.PDF => 0123.pdf 
0123_14-5678_jobname.p2.PDF => 0124.pdf 
0125_14-5678_jobname.p1.PDF => 0125.pdf 
jobname_0123_14-5678.p1.PDF => 0123.pdf 
jobname_0123_14-5678.p2.PDF => 0124.pdf 
jobname_0125_14-5678.p1.PDF => 0125.pdf 
+0

@alien Большое вам спасибо, это почти идеально. Я честно ничего не понимаю ** что-то **, что делает регулярное выражение, мой мозг жарит на этом. Но в вашем примере '0123.pdf' существует два раза. Оригиналы часто вырезаются на 2 страницы PDF-файла. Как мне избавиться от '14-5678_jobname_0123_.p2.PDF' как a) игнорировать его, не использовать, не совпадать с этим или b) идеальное решение: вычислить его на странице 124, что это такое? – Steve

+0

Не уверен, что это необходимо, но не работает с: '$ f =" 1234-5678_jobname_0123_.p1.PDF ";' – Toto

+0

@ M42: Это не должно работать. 14 на 2014 год. Таким образом, 14-5678 будет вакантным номером 5678 в 2014 году. – Steve

Смежные вопросы