2015-07-06 2 views
-1

У меня есть массив строк и хотел бы проверить:тесты строки с использованием регулярных выражений

Примеры:

$strings = array(
    'tmp/install_55984fc72cf6a/admin/views/categories/view.html.php', // Match 
    'tmp/install_55984fc72cf6a/admin/views/coupons/index.html', // Match 
    'tmp/install_55984fc72cf6a/admin/views/coupons/tmpl/default.php', // Match 
    'install_55984fc72cf6a/admin/views/coupons/tmpl/configuration.php', // Not match 
    'configuration.php', // Match 
    'logs/error.php', // Match 
    'logs/index.html', // Match 
    'logs/joomla_update.php', // Match 
    'folder/logs/log.php', // Not Match 
    'update.php' // Not match 
); 

Я хотел бы определить массив пропущенных папок и файлов

$skip = array('configuration.php', 'logs', 'tmp'); 
  • журналы и tmp будут в начале строки;

И удалите mathched из массива строк; Как я могу это сделать? Спасибо!

+0

Почему 4-й элемент не совпадает с файлом 'configuration.php'? –

ответ

3

Дословный ответ для этой задачи будет выглядеть следующим образом

$strings = array(
     'tmp/install_55984fc72cf6a/admin/views/categories/view.html.php', // Match 
     'tmp/install_55984fc72cf6a/admin/views/coupons/index.html', // Match 
     'tmp/install_55984fc72cf6a/admin/views/coupons/tmpl/default.php', // Match 
     'install_55984fc72cf6a/admin/views/coupons/tmpl/configuration.php', // Not match 
     'configuration.php', // Match 
     'logs/error.php', // Match 
     'logs/index.html', // Match 
     'logs/joomla_update.php', // Match 
     'folder/logs/log.php', // Not Match 
     'update.php' // Not match 
    ); 
    $result = preg_grep("/^(logs|tmp|configuration.php)/", $strings, PREG_GREP_INVERT); 

Какие результаты с

Array 
(
    [8] => folder/logs/log.php 
    [9] => update.php 
) 

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

$strings = array(
    'tmp/install_55984fc72cf6a/admin/views/categories/view.html.php', // Match 
    'tmp/install_55984fc72cf6a/admin/views/coupons/index.html', // Match 
    'tmp/install_55984fc72cf6a/admin/views/coupons/tmpl/default.php', // Match 
    'install_55984fc72cf6a/admin/views/coupons/tmpl/configuration.php', // Not match 
    'configuration.php', // Match 
    'logs/error.php', // Match 
    'logs/index.html', // Match 
    'logs/joomla_update.php', // Match 
    'folder/logs/log.php', // Not Match 
    'update.php' // Not match 
); 


$result = array_filter($strings, function($input){ 
    $skip = array('configuration.php', 'logs', 'tmp'); 
    foreach($skip as $toSkip){ 
     if (strpos($input, $toSkip) !== false) { 
      // Directory Skip - Starts with 
      if(strrpos($input, $toSkip, -strlen($input)) !== FALSE){ 
       return false; 
      } 
     } 
    } 
    return true; 
}); 
+0

ответ неправильный - посмотрите на вопрос '" instal ... "- Не соответствует' – splash58

+0

@ splash58 вы правы. Я неправильно понял. Обновлено, чтобы отразить это. – Christian

1

Поскольку вы проверяете только с начала строки, регулярное выражение будет медленным решением.

Сравните две строки, чтобы решить сохранить или нет. И использовать array_filter сделать новый массив

$skip = array('configuration.php', 'logs/', 'tmp/'); 

function notSkip($str) { 
    global $skip; 
    foreach($skip as $s) 
    if($s == substr($str, 0, strlen($s))) return false; 
    return true; 
} 

$new = array_filter($strings, 'notSkip'); 
var_dump($new); 

результата

array(
    "install_55984fc72cf6a/admin/views/coupons/tmpl/configuration.php" 
    "folder/logs/log.php" 
    "update.php" 
} 
1

Вы можете использовать preg_grep с опцией PREG_GREP_INVERT. Однако с помощью простого массива в качестве фильтра немного наивный, так как у вас есть условия для каждого из элементов:

$pattern = '~^(?:logs|tmp)(?:/|$)|(?:^|/)configuration\.php$~S'; 
$result = preg_grep($pattern, $strings, PREG_GREP_INVERT); 

модель деталь:

~    # pattern delimiter 
^    # anchor for the start of the string 
(?:logs|tmp)  # non-capturing group: "logs" or "tmp" 
(?:/|$)   # non-capturing group: a slash or the end of the string 

|    # OR 

(?:^|/)   # non-capturing group: the start of the string or a slash 
configuration\.php 
$    # end of the string 
~S    # pattern delimiter, options* 

Вариант S попытки оптимизировать чередования с буквенными символами.

+0

Что-то не так с configuration.php. Например, это будет передано: plugins/arkevents/configuration/configuration.php – user889349

+0

@ user889349: Я задал вопрос с часом об этом вопросе, и вы не дали ответа. Вот почему вы получаете неправильные ответы, и у вас есть два народа, которые голосуют, чтобы закрыть ваш пост как «слишком широкий». –

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