Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Регулярный выражения


Автор: Alx 4.3.2004, 19:07
пишу:

var str = new String("string");
res = str.match("str.ng");
if (res != null)
alert (res)
else
alert ("no")

выводит alert "string";

res = str.match("str[a-z]ng");
или
res = str.match("str\wng");

"no"!

В чём дело?!

Автор: Gold Dragon 5.3.2004, 09:42
У меня

str.match("str.ng") даёт - string

str.match("str[a-z]ng") даёт - string

а вот с \w - по идее все нормально, но

str.match("str\wng") даёт - null

Автор: Alx 5.3.2004, 11:10
мне нужен скрипт, опроеделяющий является ли value поля email е-мейлом. Вот рег. выраж.

/(\w+)@([\w\._]+)/

возвращает null!!

я вот тока не понял, что после @ - набор символов - буква, цифра или подчёркивание, точка, а что такое "_" и где здесь домен первого уровня? (.ru, .com и т.д.)

ЗЫ т.к. я его не нашёл, то пробовал даже

alexandro@yandex - всё равно null!

Автор: GoodBoy 5.3.2004, 12:15
Цитата
function test(val) {
    res = val.match("[a-zA-Z._-]+\@[a-zA-Z.-]+\.\w{2,}");
    if (res != null)
        alert (res)
    else
        alert ("no")
}

будет работать для адресов НЕ содержащих русских символов.

Автор: GoodBoy 5.3.2004, 12:16
Извините... Опять слэши съелись...
Цитата
function test(val) {
    res = val.match("[a-zA-Z._-]+\\@[a-zA-Z.-]+\\.\\w{2,}");
    if (res != null)
        alert (res)
    else
        alert ("no")
}

Автор: Alx 5.3.2004, 15:12
GoodBoy
спасибо большое! smile.gif

Автор: GoodBoy 5.3.2004, 15:40
ALEXANDRO Есси чо - абращяйсси!!!!!! :-))))))

Автор: Sardar 5.3.2004, 16:58
Цитата
function test(val) {
    res = val.match("[a-zA-Z._-]+\@[a-zA-Z.-]+\.\w{2,}");
    if (res != null)
        alert (res)
    else
        alert ("no")
}

Локалхост не поймает и IP адрес тоже. Да и вообще такое пропустит privet [email protected] smile.gif
Я бы так сделал:
Код

ret=/^\s*[a-zA-Z0-9_-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*\s*$/.test(e_mail);

А если действительно на валидность надо проверять, то выполнять это надо на сервере.

Автор: GoodBoy 5.3.2004, 17:45
Sardar твой privet [email protected] не пропустит, т.к. там есть пробельный символ... Про 0-9 ты прав. Я забыл... Но у тебя не учитывается возможность присутствия символа "." в имени ящика. Т. е. адрес типа [email protected] не пройдет. Опять же зачем возможность присутствия пробельных символов в начале и в конце регэкспа? И цифр в названии доменной зоны? Зоны типа .ru13 я не знаю... :-))))
Все-таки, на мой взгляд такое выражение более правильно:
Цитата
res = val.match("[a-zA-Z0-9._-]+\\@[a-zA-Z0-9.-]+\\.\\w{2,}");

Автор: Sardar 5.3.2004, 18:20
Цитата
Sardar твой privet [email protected] не пропустит, т.к. там есть пробельный символ

Пропустит, т.к. найдется [email protected], что будет означать true и строка целиком примится как адрес.
Цитата
Зоны типа .ru13 я не знаю

Зоны можно было вручную перечислит, но не хотелось, потому все в кучу smile.gif
Цитата
адрес типа [email protected] не пройдет

Да, точку надо добавить, а вообще лучше RFC по URL'ам найти и точно посмотреть допустимые символы.
Цитата
Все-таки, на мой взгляд такое выражение более правильно:
Цитата

res = val.match("[a-zA-Z0-9._-]+\\@[a-zA-Z0-9.-]+\\.\\w{2,}");

Многоточие все равно пройдет, IP допущен не будет. Слеш перед собакой не нужен.

Вообще нужно покопатся в доке, либо взять готовый рег из PHP скриптов(где то на phpdetail.phpclub.ru лежит).

Автор: GoodBoy 5.3.2004, 19:07
Цитата
Многоточие все равно пройдет, IP допущен не будет. Слеш перед собакой не нужен.

Это почему же IP допущен не будет?? Этот вариант [a-zA-Z0-9.-]+ предполагает наличие произвольного количества букв, цифр и точек!
Многоточие пройдет, согласен, но от этого можно избавиться так:
Код
res = val.match("[a-zA-Z0-9._-]+\\@([a-zA-Z0-9-]+\\.)+\\w{2,4}");

Здесь будут учтены и IP адреса (хотя я не знаю людей, которые бу указывали в своем мыле адрес а не доменное имя), и отсечена возможность использования многоточия, и недопустима длина доменной зоны меньше 2 и больше 4 символов (по-моему сейчас это именно так .ru, .com, .info).
А насчет слешей перед собакой... Лучше перебдеть, чем недобдеть... :-))))))))))))))

Автор: Alx 5.3.2004, 20:42
дык эт вам спасибо! smile.gif а почему мой регэксп не работает?

Автор: Gold Dragon 6.3.2004, 11:37
Адрес должен соответсвовать следующим условиям:

1. Отрезаем пробелы в начале и в конце
2. Проверяем наличие [@]
3. Проверяем символы до [@] - [a-z],[A-Z],[0-9],[-],[_] (минимум один)
(Точно не знаю допустимо ли начинать адрес с [-] или [_])
5. Проверяем после [@] обязательное наличие [.]
6. Проверяем после [@] символы - [a-z],[A-Z],[0-9],[-],[_]
7. Проверяем символ после [@] - [a-z],[A-Z],[0-9]
8. Проверяем наличие два символа [.] подряд
9. Проверяем наличие хотя бы одного символа между [@] и [.]
10. Проверяем наличие хотя бы одного символа после [.]

Автор: Sardar 6.3.2004, 16:06
Вот чуть построже:
Код

/^\s*[a-z0-9_][a-z0-9-_]*@(?:[a-z0-9_][a-z0-9-_]*(?:\.[a-z0-9-_]+)*)\s*$/i.test(email);

Я не помню, может ли поддомен начинатся с цифры. Только что попробовал найти точный синтаксис мыла - нашел RFC822 - огроменный запутанный текст, BNF грамматики раскиданны по всему документу, на мой взгляд это хороший пример плохой документации.

Автор: nikolin 7.3.2004, 09:21
Код
function vrf(x){
m = x.match(/\b(^(\S+@).+((\.com)|(\.net)|(\.edu)|(\.mil)|(\.gov)|(\.org)|(\.biz)|(\.info)|(\..{2,2}))$)\b/gi);
(m)?alert('Is valid email'):alert('I'snt valid email');
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)