alhames.ru
Как на регулярке задать шаблон "одна или более латинских букв, кроме слов 'admin' и 'user'"?
А то я чет никак сообразить не могу..
А то я чет никак сообразить не могу..
я бы проверил на админа и юзера обычным tolowercase + трим стринг компэром. а 1 или более латинских букв, "[a-zA-Z]+"
помому ты не прав
вроде ^admin|^user просто негация первой буквы из группы букв a,d,m,i,n или u,s,e,r
з.ы короче любые слова из 1+ букв, кроме a,d,m,i,n,u,s,e,r
к примеру [^A-Za-z] возвращает все небуквенные символы.
имо, блоки тут - отдельные буквы - не строки.
т.е будет матчить только строки из всех букв, кроме букв a,d,m,i,n,u,s,e,r.
з.ы а приоритет операций, какой? всмысле + должен быть за скобками, или сначала всё равно будет | ? мну думал приоритет у + и других унарных операций выше.
([^\badmin\b]|[^\buser\b]+)
насколько я помню, компиляция начинается от низшего приоритета к высшим. бессмысленно имхо компилировать + когда внутреннее выражение не откомпилено. хотя точно сказать не могу.
[\badmin\b]=(\b|a|d|m|i|n) а НЕ <word boundary>admin<word boundary>
[] это группа символов ИЗ КОТОРЫХ ДЕЛАЮТ СТРОКИ, а НЕ СТРОКА В СКОБКАХ.
Негация работает ТОЛЬКО на символы ИЗ которых делают строки, негации СТРОК - НЕТ.
максимум, можно сделать сиквенс [^a][^d][^m][^i][^n] - не admin, но ЗАЧЕМ? обычные string функции на поиск админа и юзера - ДЕШЕВЛЕ чем регекс.
я бы проверил на админа и юзера обычным tolowercase + трим стринг компэром. а 1 или более латинских букв, "[a-zA-Z]+"
это необходимо для .htaccess, а не для php-файла.. =(
а 1 или более латинских букв, "[a-zA-Z]+"
Эт я знаю.. Ток пишется наоборот: [A-Za-z]+
/([^admin]|[^user]+)/i
имо, блоки тут - отдельные буквы - не строки.
Потому-то я и застрял..
barsy
([^\badmin\b]|[^\buser\b]+)
плз, поясни написанное.. И это, как я понимаю, запретит только эти два слова, а как быть с "одна или более латинских букв"?
можно сделать сиквенс [^a][^d][^m][^i][^n]
А помоему это просто запретит эти буквы..
может, обойтись тогда обратным по смыслу выражением, сделав с него редирект куда-нибудь на страницу ошибки?
(admin|user|[^a-zA-Z]*?)
сорри, что-то до меня тоже не доходит, как сделать отрицание...
нет, поскольку это не в одной [], это запретит последовательность букв a d m i n в строке.
>>La personne mystique
помому хорошая идея.
например, паттерн
(?!admin)(?!user)[a-zA-Z]+
при передаче ему строки "/admin/" совпадает с "dmin", но не с "admin".
а для "/testpage/" совпадает целиком с "testpage".
т.е. вроде отрабатывает, но глючно на подстроках "admin", "user"
(?!a)(?!u)[a-zA-Z]((?!d)(?!s)[a-zA-Z]((?!m)(?!e)[a-zA-Z]((?!i)(?!r)[a-zA-Z]((?!n)[a-zA-Z]([a-zA-Z]+|)|)|)|)|)
но, кажется, она работает так же, как предыдущий мой паттерн
^(?!admin)(?!user)[a-zA-Z]+$ - совпадет с любым [a-zA-Z]+, кроме "admin" и "user", условие как бы выполнено ^^''
сорри за флуд ^^'
а вообще, можно уточнить задачу?))
Есть адреса: site.ru/admin, site.ru/foto, site.ru/video, etc.
Есть файл .htaccess:
Надо сделать так, чтоб при вводе любого адреса (из латинских букв) срабатывала вышеуказанная строка, и чтоб она не срабатывала на слова "admin" и "user". На эти слова должно срабатывать к примеру это:
может, обойтись тогда обратным по смыслу выражением, сделав с него редирект куда-нибудь на страницу ошибки?
А как тогда обрабатывать остальные адреса?
^(?!admin)(?!user)[a-zA-Z]+$ - совпадет с любым [a-zA-Z]+, кроме "admin" и "user", условие как бы выполнено ^^''
Ээ.. А пояснить? О_Оь
а строка, к которой применяется выражение, не со слеша ли начинается? )
и ты точно забыл про конечный слеш, которые иногда добавляются автоматически.
anyway,
RewriteRule ^(/|)(?!admin)(?!user)[a-zA-Z]+(/|)$ /index.php?process=$2 [QSA]
выглядит правдоподобно, по-моему...
А как тогда обрабатывать остальные адреса?
можно попробовать сначала написать RewriteRule для admin и user, то самое
RewriteRule ^admin$ /index.php?who=admin
а потом для остальных... тем более, что второй паттерн ^([a-zA-Z])$ никогда не совпадет с /index.php?who=admin...
а строка, к которой применяется выражение, не со слеша ли начинается? )
и ты точно забыл про конечный слеш, которые иногда добавляются автоматически.
Ну это мелочи, вопрос не в этом..
Что означает "(/|)" - "слеш не употреблен или употрблен не более раза? Но ведь квантификатор "ноль или один раз" - это "?".
Потом, что означает запись "(?!...)"?
Я ж хочу разобраться, а не просто скопировать код! =)
ну, это то же самое, что и /{0,1} и /?, просто почему-то мне так привычнее...
(?!...)
(?!...), (?=...) - проверка (не)совпадения с подвыражением без изменения текущей позиции. короче, "заглядывание вперед"
(?!abc) означает, что после этого идет что-то, но не "abc"
например, (?!abc)[a-z]+ совпадает с любым набором латинских строчных букв, кроме тех, которые начинаются с "abc"
ru2.php.net/manual/ru/reference.pcre.pattern.sy... - см. абзац "Утверждения"
Кажется разобрался =))