Запретить глобусу выбирать файл с указанным c именем файла - PullRequest
1 голос
/ 17 февраля 2020

У меня есть папка с 5 html файлами. Файлы называются:

  • page-1. html
  • page-2. html
  • page-hello. html
  • page-32. html
  • yo-page-text. html

I sh для использования функции glob для возврата массива только с отформатированные файлы: «страница [число 0 - 1000]». Таким образом, по сути я буду использовать sh функцию glob для возврата следующих страниц из примера выше:

  • page-1. html
  • page-2. html
  • page-32. html

Это код, который мне удалось написать до сих пор:

<?php
    $directory = "testfolder/";
    foreach (glob($directory . "page-*.html") as $filename) {
        echo basename($filename);
    }
?>

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

Шаблон glob не так гибок, как RegEx, поэтому, если у кого-то нет других магов c, вы можете фильтровать по глобусу:

$files = preg_grep('/page-[0-9]+\.html/', glob($directory . '*.*'));

Если шаблон glob поддерживает повторение + тогда было бы легко. Bash и оболочки Korn предлагают его с +([0-9]), но PHP этого не делает.

Вы также можете проверить на одно число и поверить, что следующие значения, соответствующие *, будут числами с: glob($directory . 'page-[0-9]*.html'), но это также может соответствовать page-0-hello.html.

1 голос
/ 17 февраля 2020

Предполагая, что ваш код работает и вы получаете basename файлов:

$name = basename($filename); //do not echo the basename
for ($i = 0; $i <= 1000; $i++) {
  $trname = "page-$i";
  if ($name == $trname) {
    echo "$name";
  }
}

Поместите один из этих кодов в foreach и избавьтесь от echo basename($filename);. Я бы порекомендовал использовать второй, так как вложенные циклы могут оказаться проблемой.

Примечание : Этот код может работать, только если работает ваш.

ВАЖНОЕ РЕДАКТИРОВАНИЕ : я предполагаю, что вы хотите что-то сделать (не повторяя) имена, в этом случае:

function foo(bar) {
  $arr = array();
  $name = basename($filename);
  $name = str_replace("page-", "", $name);
  if (intval($name) < 1000 && intval($name) >= 0) {
    $arr[] = $name;
  }
}

Затем вы можете вызвать функцию таким образом:

function foo() {
$arr = array();
$directory = "testfolder/";
foreach (glob($directory . "page-*.html") as $filename) {
  $name = basename($filename);
  $name = str_replace("page-", "", $name);
  if (intval($name) < 1000 && intval($name) >= 0) {
    $arr[] = $name;
  }
}
}
$bar = foo();
foreach ($bar as $obj) {
  //do something
}
...