Справка с регулярным выражением для соответствия любому URL-адресу, а не папке администратора

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

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

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

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

который терпит неудачу, поскольку строковая строка «mens-books», которую я ищу, является совпадением с буквой m в строке «admin», поэтому она терпит неудачу.

Я тоже пробовал сделать это так:

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

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

Затем я сделал следующее:

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

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

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

Спасибо.

Matt

 if (substr($url, 0, 6) !== 'admin/') { echo 'Yippie'; } 

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

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

 ^(?!admin\/) 

Вот некоторые примеры preg_match:

 preg_match('/^(?!admin\/)/', 'mens-books'); // true preg_match('/^(?!admin\/)/', 'admin/mens-books'); // false preg_match('/^(?!admin\/)/', 'admin-mens-books'); // true 

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

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

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

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

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

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

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

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