Помогите с регулярным выражением, чтобы соответствовать любой URL, кроме того, что из папки администратора - PullRequest
5 голосов
/ 09 июня 2011

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

Я хочу создать регулярное выражение для использования с функцией маршрутизации cms с использованием php и preg_match, которая соответствует любому URL, который не начинается со строки 'admin /', так как somedomain.com/admin/ будет частью администратора см.

Я уже пробовал

preg_match('#^([^admin])+(.+)$#', 'mens-books'))

, которая не выполняется, так как искомая строка url 'mens-books' совпадает с буквой m в строке 'admin', поэтому она не работает.

Я пытался сделать это так же:

preg_match('#^([^admin$])+(.+)$#', 'mens-books'))

как доллар символизирует конец строки, но это тоже не сработало.

Я тогда сделал это:

preg_match('#^[?!=admin]+(.+)$#', 'mens-books'))

, который вернул true, но только я думаю, потому что?! = В регулярном выражении теперь будет соответствовать всему, что начинается с a, d, m, i или n.

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

Thankyou.

Мэтт

Ответы [ 5 ]

6 голосов
/ 09 июня 2011
if (substr($url, 0, 6) !== 'admin/')
{
  echo 'Yippie';
}

Но чтобы ответить на вопрос регулярных выражений.Когда вы используете квадратные скобки, вы указываете класс персонажа.Это означает, что [admin] соответствует одному символу, который является a, d, m, i или n.Если вы пропустите скобки, вы получите буквенную строку.Но, как показывает мой код, совсем не обязательно использовать регулярные выражения, если вам нужно проверить, начинается ли строка с фиксированной подстроки.

4 голосов
/ 09 июня 2011

Если вы хотите использовать регулярные выражения, то, что вы ищете, это то, что называется отрицательный взгляд , который является утверждением нулевой ширины (он проверяет наличие или отсутствие текста, не «съедая» его). ). Это будет работать примерно так:

^(?!admin\/)

Вот несколько конкретных примеров preg_match:

preg_match('/^(?!admin\/)/', 'mens-books');        // true
preg_match('/^(?!admin\/)/', 'admin/mens-books');  // false
preg_match('/^(?!admin\/)/', 'admin-mens-books');  // true
2 голосов
/ 09 июня 2011

скобки [] используются для любого отдельного символа [admin] - это a, d, m, i или n, а не admin, то, что вы, вероятно, хотите, это (admin). Таким образом, все, что начинается с admin, будет /^(admin).*$/, тогда самый простой способ - вставить не в ваш код.

пример (не php-кодер, поэтому заранее извините):

$pattern = '/^(admin)\/.*$/'
if (preg_match($pattern, $url) == 1) {
    $match = true;
} else {
    $match = false;
}

, который предполагает, что вы пытаетесь вернуть логическое значение

0 голосов
/ 09 июня 2011

Я не совсем уверен, что следую, но ты просто не хочешь

preg_match('^(/)?admin(/)?.*', 'mens-books'))

например, начинается с / admin или admin

0 голосов
/ 09 июня 2011

Попробуйте ^(?!admin/).*$, но я думаю, что сравнение подстроки намного быстрее.

...