Как вы используете курсор ('^') для исключения файлов / папок только один раз в синтаксисе PCRE Regex? - PullRequest
0 голосов
/ 26 марта 2012

Например, у меня есть в файле conf.php:

$GLOBALS["no_access"] = '^forbidden|restricted|xampp|apache\_pb';

блокирует эти файлы / папки для просмотра и хотел бы ограничить эти строки (папки / файлы) ограниченное количество раз. Это потому, что это проект интрасети, и может быть папка, к которой я не хочу получать доступ, с тем же именем файла или папки, которые я хочу сделать доступными. Кроме того, возможно ли выбрать первый экземпляр, но не позже?

Это для изменения компонента Joomla, который называется eXtplorer, файловый менеджер.

Ответы [ 2 ]

2 голосов
/ 26 марта 2012

Это будет работать в любом случае, но белый список будет сейфом, а не черным списком (так что вы можете получить доступ только к каталогам, начинающимся с x).

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

$regex = '/^(?:forbidden|restricted|xampp|apache_pb)/i';

В php это может выглядеть так:

function startIsRestricted($string) {
    return preg_match('/^(?:forbidden|restricted|xampp|apache_pb)/i', $string);
}

Редактировать

Чтение этого обсуждения звучит так, будто вы хотите ограничить доступ к папкам. В этом случае вы можете захотеть взглянуть на защищающие каталоги с помощью документации по htaccess и htpasswd, которую вы можете найти на веб-сайте apache или на этом веб-сайте , немного перейдя ко всему этому. более

Ограничение в PHP было бы небезопасно ...

Редактировать 2

Код проверен на прочность ; по крайней мере, теперь я делаю взрыв вокруг карты массива (duh) и исправляю очевидные орфографические ошибки.

Но это должно, по крайней мере, дать хорошее представление о том, как вы можете сделать эту проверку рекурсивно для каждого каталога в строке ...

/**
 * Function to check an entire string recursively to see if dissalowed directories are present
 * Assuming the string seperator will be a forwardslash
 *
 * @param string $string String to be evaluated against the dissalowed directory list given or else default
 * @param array $dissallow array of strings which are forbidden to be at the start of any of the directories
 * @param string $sep The seperator for the directory levels
 * 
 * @return string
 */
function test_directory ($string, array $dissallow = array('forbidden', 'restricted', 'xampp', 'apache_pb'), $sep = '/') {
    $regex  = '/^(?:' . implode('|', array_map ('preg_quote', $dissallow)) . ')/i';
    $dirs   = explode($sep, $string);

    foreach($dirs as $dir) {
        // true will mean a match is found and thus present in the beginning of a directory in $string
        if(preg_match($regex, $dir))
            return true;
    }
    return false;
}

Теперь я должен заметить, что регулярные выражения в подобных случаях могут замедлять работу, и его следует использовать слишком часто, если прямое совпадение с какой-либо строкой в ​​массиве disSowow подходит для вас, проверяя каждый $dir в $dirs против каждой записи $dissallow.

1 голос
/ 26 марта 2012

Для PCRE ^ говорит Соответствует началу строки . С оператором | вы говорите 'this ИЛИ that`.

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

/^(forbidden|restricted|xampp|apache\_pb)/i

будет совпадать в начале строки (например, список каталогов)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...