регулярное вырожение

Xaser

Новичок
регулярное вырожение

PHP:
function validlogin ($s) {  
$b = iconv("UTF-8", "CP1251", "$s");
 if (!preg_match('/^[A-z1-9_()-\]\[]{3,15}$/',$b) AND !preg_match('/^[А-я1-9_()-\]\[]{3,15}$/',$b))   {return 1;exit();}   }
Выше функция. Поидее разрешены тока символы рус и анг! () [] _ -

Нопочемуто на практике много чего пропускает! например @ и ;

Подскажите где я ошибся
 

zarus

Хитрожопый макак
1. Изучаем русский язык.
Регулярное "вырОжение" пишется совсем не так.
"непомогло" тоже пишется НЕ____ТАК

2. Изучаем синтаксис PHP.
Ты бы еще "$s" написал '$s'.

3. Изучаем логические операции в PHP.
Конструкция (!preg_match(...) and !preg_match(...)) дает тебе именно то, что ты получаешь, а не то, что ты якобы хотел.

Вывод. Голова на плечах лучше, чем язык без костей. И регулярные выражения тут вообще не при чем.
 

Xaser

Новичок
1. Пушу как хочу

2. print 'текст'.$s.'текст'; это потвоему неправельно? а надо так

print "текст $s текст"; да ?

3. Я дал конкретный пример и задал вопрос. Да я гдето ошибся! я не кричу что я прав! Я прошу помоч! указать где я ошибся
 

zarus

Хитрожопый макак
1.
Чеши песло.

2.
$b = iconv("UTF-8", "CP1251", "$s"); - это правильно, это пять, потому что КОСЯК

3.
Я тебе конкретно указал, где у тебя ошибка. Но судя по всему, она не только там.
 

Xaser

Новичок
двойные ковычки?
или (!preg_match(...) and !preg_match(...)) ? дык у меня так и есть
 

Nimous

Guest
Xaser
Попробуй в реге перечислить ЗАПРЕЩЁННЫЕ символы.
Сразу всё станет проще и понятней.
 

Astral Man

We Will Rock You
PHP:
function validlogin ($s) {

    if (preg_match('{^([a-zA-Zа-яА-яёЁ0-9_()\-\]\[]{3,15})$}', $s)) {
        echo $s;
    }

}
 

whirlwind

TDD infected, paranoid
учите матчасть

[ ] - класс символов
[^ ] - отрицание класса символов

PHP:
if ( preg_match("/[^разрешенные_символы]/",$s) ){
   // invalid
}
 

zarus

Хитрожопый макак
if (!preg_match('/^[A-z1-9_()-\]\[]{3,15}$/',$b) AND !preg_match('/^[А-я1-9_()-\]\[]{3,15}$/',$b))
Будет пропускать только выражения СОДЕРЖАЩЕЕ ВСЕ, ЧТО УГОДНО, кроме строк вида aaaaa1122123123.
Зачем ему помогать, если у него логический аппарат на биологическом уровне не работает?
 

SelenIT

IT-лунатик :)
Xaser
много чего пропускает
Это "много чего" попадает, например, в интервал Z-a и - особенно - в интервал )-\] :). Желательно всегда ставить дефис в конец класса, чтобы он не интерепретировался как интервал. А для компактной записи букв в обоих регистрах пользоваться модификатором i.

zarus
Прежде чем бросаться бездоказательными обобщениями, рекомендую потренировать внимательность и восполнить свои пробелы в знаниях:
- запись "$s" не является ошибкой в PHP;
- функция validlogin у автора темы делает именно то, что ему надо - "посылает подальше" в случае неверного ввода (то, что делает она это достаточно коряво - другой разговор)...

Хотя насчет общей грамотности - согласен, ее отсутствие производит неприятное впечатление :)
 

zarus

Хитрожопый макак
Автор оригинала: SelenIT
Прежде чем бросаться бездоказательными обобщениями, рекомендую потренировать внимательность и восполнить свои пробелы в знаниях:
- запись "$s" не является ошибкой в PHP;
Не является ошибкой, но вызывает раздражение, так же, как прыщ на носу. И насчет пробелов в моих знаниях Вы явно поторопились. Да, они есть, но не в области приведения типов данных.
Автор оригинала: SelenIT
функция validlogin у автора темы делает именно то, что ему надо - "посылает подальше" в случае неверного ввода (то, что делает она это достаточно коряво - другой разговор)...
Вот как раз в том виде, что он написал, она этого не делает. И не потому что, она пропускает символы, которые ему не нужны, а потом что конкатенация логических операций у него построена неверно.
 

SelenIT

IT-лунатик :)
zarus

Мда уж... Мы с Вами оказались достойны друг друга по части невнимательности. Оба придирались по сути к пустякам, а главного косячищи (return-а перед exit-ом) и не приметили :)
Но если убрать этот нелепый ретурн, то в логике вида
PHP:
если (НЕ(соответствует('/^рыба$/')) И НЕ(соответствует('/^мясо$/'))) {
   послать_с_сообщением ("Не рыба не мясо");
}
лично я ошибки по-прежнему не вижу - только неоптимальность...
 

zarus

Хитрожопый макак
Автор оригинала: SelenIT
zarus

Мда уж... Мы с Вами оказались достойны друг друга по части невнимательности. Оба придирались по сути к пустякам, а главного косячищи (return-а перед exit-ом) и не приметили :)
Но если убрать этот нелепый ретурн, то в логике вида
PHP:
если (НЕ(соответствует('/^рыба$/')) И НЕ(соответствует('/^мясо$/'))) {
   послать_с_сообщением ("Не рыба не мясо");
}
лично я ошибки по-прежнему не вижу - только неоптимальность...
в том то и дело, что у него условие:
Если (НЕ(рыба) И НЕ(мясо)), то ЭТО РЫБА ИЛИ МЯСО!
 

Xaser

Новичок
Убрал exit() и всё заработало! непонимаю зачем его туда сунул
 
Сверху