Я застрял в чем-то, что, как я знаю, должен быть простым, но сейчас кругом крутится.
Я хочу создать регулярное выражение для использования с функцией маршрутизации 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/).*$
но я думаю, что сравнение подстроки происходит намного быстрее.