11:56

RegEx

alhames.ru
Как на регулярке задать шаблон "одна или более латинских букв, кроме слов 'admin' и 'user'"?
А то я чет никак сообразить не могу..

@темы: PHP

Комментарии
05.03.2008 в 12:11

Geza Anda pl Mozart-PC 21 in CM K467-I Allegro Maestoso[13:54].flac
эх, хз есть ли в пхп регексах негация,
я бы проверил на админа и юзера обычным tolowercase + трим стринг компэром. а 1 или более латинских букв, "[a-zA-Z]+"
05.03.2008 в 12:12

Клиа.
/([^admin]|[^user]+)/i
05.03.2008 в 12:15

Geza Anda pl Mozart-PC 21 in CM K467-I Allegro Maestoso[13:54].flac
>>/([^admin]|[^user]+)/i
помому ты не прав
вроде ^admin|^user просто негация первой буквы из группы букв a,d,m,i,n или u,s,e,r
з.ы короче любые слова из 1+ букв, кроме a,d,m,i,n,u,s,e,r
05.03.2008 в 12:19

Клиа.
Нет. ^ в начале - это отрицание всего блока.
к примеру [^A-Za-z] возвращает все небуквенные символы.
05.03.2008 в 12:28

Geza Anda pl Mozart-PC 21 in CM K467-I Allegro Maestoso[13:54].flac
([^admin]|[^user]+)
имо, блоки тут - отдельные буквы - не строки.

т.е будет матчить только строки из всех букв, кроме букв a,d,m,i,n,u,s,e,r.

з.ы а приоритет операций, какой? всмысле + должен быть за скобками, или сначала всё равно будет | ? мну думал приоритет у + и других унарных операций выше.
05.03.2008 в 12:43

Клиа.
да, точно, я не подумала.

([^\badmin\b]|[^\buser\b]+)

насколько я помню, компиляция начинается от низшего приоритета к высшим. бессмысленно имхо компилировать + когда внутреннее выражение не откомпилено. хотя точно сказать не могу.
05.03.2008 в 13:22

Geza Anda pl Mozart-PC 21 in CM K467-I Allegro Maestoso[13:54].flac
аааааа....о боги....

[\badmin\b]=(\b|a|d|m|i|n) а НЕ <word boundary>admin<word boundary>

[] это группа символов ИЗ КОТОРЫХ ДЕЛАЮТ СТРОКИ, а НЕ СТРОКА В СКОБКАХ.

Негация работает ТОЛЬКО на символы ИЗ которых делают строки, негации СТРОК - НЕТ.

максимум, можно сделать сиквенс [^a][^d][^m][^i][^n] - не admin, но ЗАЧЕМ? обычные string функции на поиск админа и юзера - ДЕШЕВЛЕ чем регекс.
05.03.2008 в 13:27

alhames.ru
Itsygo
я бы проверил на админа и юзера обычным tolowercase + трим стринг компэром. а 1 или более латинских букв, "[a-zA-Z]+"
это необходимо для .htaccess, а не для php-файла.. =(

а 1 или более латинских букв, "[a-zA-Z]+"
Эт я знаю.. Ток пишется наоборот: [A-Za-z]+

/([^admin]|[^user]+)/i
имо, блоки тут - отдельные буквы - не строки.
Потому-то я и застрял..

barsy
([^\badmin\b]|[^\buser\b]+)
плз, поясни написанное.. И это, как я понимаю, запретит только эти два слова, а как быть с "одна или более латинских букв"?
05.03.2008 в 13:31

Клиа.
в голове моей опилки.. :shuffle:
05.03.2008 в 13:33

alhames.ru
Itsygo
можно сделать сиквенс [^a][^d][^m][^i][^n]
А помоему это просто запретит эти буквы..
05.03.2008 в 13:34

 
это необходимо для .htaccess, а не для php-файла.. =(
может, обойтись тогда обратным по смыслу выражением, сделав с него редирект куда-нибудь на страницу ошибки?
(admin|user|[^a-zA-Z]*?)

сорри, что-то до меня тоже не доходит, как сделать отрицание...
05.03.2008 в 13:35

Клиа.
этого я не знаю.
05.03.2008 в 13:37

Geza Anda pl Mozart-PC 21 in CM K467-I Allegro Maestoso[13:54].flac
>>А помоему это просто запретит эти буквы..

нет, поскольку это не в одной [], это запретит последовательность букв a d m i n в строке.

>>La personne mystique

помому хорошая идея.
05.03.2008 в 13:42

 
а вообще, можно уточнить задачу?))

например, паттерн
(?!admin)(?!user)[a-zA-Z]+

при передаче ему строки "/admin/" совпадает с "dmin", но не с "admin".
а для "/testpage/" совпадает целиком с "testpage".
т.е. вроде отрабатывает, но глючно на подстроках "admin", "user"
05.03.2008 в 14:04

 
есть еще дурацкая идея по поводу
(?!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", условие как бы выполнено ^^''

сорри за флуд ^^'
05.03.2008 в 14:13

alhames.ru
La personne mystique
а вообще, можно уточнить задачу?))
Есть адреса: site.ru/admin, site.ru/foto, site.ru/video, etc.
Есть файл .htaccess:
RewriteRule ^([A-Za-z])$ /index.php?act=$1


Надо сделать так, чтоб при вводе любого адреса (из латинских букв) срабатывала вышеуказанная строка, и чтоб она не срабатывала на слова "admin" и "user". На эти слова должно срабатывать к примеру это:
RewriteRule ^admin$ /index.php?who=admin



может, обойтись тогда обратным по смыслу выражением, сделав с него редирект куда-нибудь на страницу ошибки?
А как тогда обрабатывать остальные адреса?
05.03.2008 в 14:18

alhames.ru
La personne mystique
^(?!admin)(?!user)[a-zA-Z]+$ - совпадет с любым [a-zA-Z]+, кроме "admin" и "user", условие как бы выполнено ^^''
Ээ.. А пояснить? О_Оь
05.03.2008 в 14:28

 
RewriteRule ^([A-Za-z])$ /index.php?act=$1
а строка, к которой применяется выражение, не со слеша ли начинается? )
и ты точно забыл про конечный слеш, которые иногда добавляются автоматически.

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...
05.03.2008 в 14:43

alhames.ru
La personne mystique
а строка, к которой применяется выражение, не со слеша ли начинается? )
и ты точно забыл про конечный слеш, которые иногда добавляются автоматически.

Ну это мелочи, вопрос не в этом..

^(/|)(?!admin)(?!user)[a-zA-Z]+(/|)$


Что означает "(/|)" - "слеш не употреблен или употрблен не более раза? Но ведь квантификатор "ноль или один раз" - это "?".
Потом, что означает запись "(?!...)"?
Я ж хочу разобраться, а не просто скопировать код! =)

05.03.2008 в 14:56

 
(/|) - либо слэш, либо ничего
ну, это то же самое, что и /{0,1} и /?, просто почему-то мне так привычнее...

(?!...)
(?!...), (?=...) - проверка (не)совпадения с подвыражением без изменения текущей позиции. короче, "заглядывание вперед"
(?!abc) означает, что после этого идет что-то, но не "abc"
например, (?!abc)[a-z]+ совпадает с любым набором латинских строчных букв, кроме тех, которые начинаются с "abc"
ru2.php.net/manual/ru/reference.pcre.pattern.sy... - см. абзац "Утверждения"
05.03.2008 в 15:20

alhames.ru
La personne mystique благодарю =)
Кажется разобрался =))

Расширенная форма

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

Подписаться на новые комментарии
Получать уведомления о новых комментариях на E-mail