Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.05.2013, 03:32
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от qwerty-клавиатура
 
Регистрация: 12.04.2013
Сообщений: 132

Регулярные выражения головного мозга
function parseURL(str) {
        var re = /^(?:([a-zA-Z]+:)\/\/)?(?:([-+._a-zA-Z0-9]+)(?::([-+._a-zA-Z0-9]+))?@)?(([^-~!@#$%^^&*\(\)_+=\[\]{}:;'"\\,.\/?\s]+(?:[^~!@#$%^^&*\(\)_+=\[\]{}:;'"\\,.\/?\s]+[^-~!@#$%^^&*\(\)_+=\[\]{}:;'"\\,.\/?\s])*(?:\.[^-~!@#$%^^&*\(\)_+=\[\]{}:;'"\\,.\/?\s]+(?:[^~!@#$%^^&*\(\)_+=\[\]{}:;'"\\,.\/?\s]+[^-~!@#$%^^&*\(\)_+=\[\]{}:;'"\\,.\/?\s])*)*)(?::(\d+))?)?(\/[^?#]*)?(\?[^#]*)?(#.*)?$/;
        var scheme = ['protocol', 'user', 'password', 'hostname', 'host', 'port', 'pathname', 'search', 'hash'], parts = re.exec(str);
        
        if (parts != null) {
            for (var i = 0, l = scheme.length, obj = {}; i < l;) {
                obj[ scheme[i] ] = parts[++i] != undefined ? parts[i] : '';
            }
            
            return obj;
        }
        
        return false;
    }


как неудивительно оно работает, но вот только делается все это намного проще. кто знает как?
Ответить с цитированием
  #2 (permalink)  
Старый 11.05.2013, 11:08
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

странная регулярка и видимо не проверенная временем
Сообщение от qwerty-клавиатура
([a-zA-Z]+:)
протокол может содержать цифры, а тут только буквы
Сообщение от qwerty-клавиатура
(?:([a-zA-Z]+:)\/\/)?
ссылка может начинаться с двух слешей без протокола, а тут это не предусмотрено
Сообщение от qwerty-клавиатура
(?:([-+._a-zA-Z0-9]+)
имя пользователя часто имеет и другие символы
Сообщение от qwerty-клавиатура
(?::([-+._a-zA-Z0-9]+))?@)?
пароль, вообще может содержать все что угодно

про остальное вообще сложно сказать что намудрено.

Сообщение от qwerty-клавиатура
return false;
что за возврат ложного значения? любая строка в первую очередь если она не подходит любым критериям, должна расцениваться как путь(pathname).

вот мой вариант написанный как то давно. хотя он и не претендует на идеал, ибо не проходил жестких тестов.
function parseURL(url) {
    var m = /(?:([\w0-9]+:))?(?:\/\/(?:(?:([^:]*):)?([^@]*)@)?(([^\/:\?#]+)(?:\:([0-9]+))?))?([^\?#]*)(?:(\?[^#]+)|\?)?(?:(#.*))?/.exec(url);
    return {
        protocol: m[1]||'',
        username: m[2]||'',
        password: m[3]||'',
        hostname: m[5]||'',
        host: m[4]||'',
        port: m[6]||'',
        pathname: m[7].replace(/^\s+/g,''),
        search: (m[8]||'').replace(/^\s+|\s+$/g,''),
        hash: m[9]||''
    }
}
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine

Последний раз редактировалось devote, 11.05.2013 в 11:17.
Ответить с цитированием
  #3 (permalink)  
Старый 11.05.2013, 12:55
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от qwerty-клавиатура
 
Регистрация: 12.04.2013
Сообщений: 132

все намного проще, что касается логина и пароля, то там у меня все по стандарту, протокол может содержать хекс %HH как и доменное имя(1-.%00 по стандарту валидное), но ни таких протокол ни доменных имен нет

function parseURL(s) {
    var a = document.createElement('a');
    a.href = s;
    
    var o = {
        hash: '',
        host: '',
        hostname: '',
        href: '',
        origin: '',
        pathname: '',
        port: '',
        protocol: '',
        search: ''
    }
    
    for (var p in o) {
        if ( o.hasOwnProperty(p) ) {
            o[p] = a[p];
        }
    }
    
    return o;
}
Ответить с цитированием
  #4 (permalink)  
Старый 11.05.2013, 13:06
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,585

var a = document.createElement('a');
a.href = 'http://javascript.ru:999/forum/offtopic/37857-regulyarnye-vyrazheniya-golovnogo-mozga.html?neko#nya';
alert([
        'protocol: ' + a.protocol,
        'hostname: ' + a.hostname,
        'host: ' + a.host,
        'port: ' + a.port,
        'pathname: ' + a.pathname,
        'search: ' + a.search,
        'hash: ' + a.hash
].join('\n'))



upd: опоздал чутка.
__________________
29375, 35

Последний раз редактировалось Aetae, 11.05.2013 в 13:08.
Ответить с цитированием
  #5 (permalink)  
Старый 11.05.2013, 14:14
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от qwerty-клавиатура
все намного проще
ага, ты во всех браузерах проверил? этот вариант в некоторых браузерах глючит, во вторых, тебе в твою ссылку могут быть подставлены домен/протокол и т.д. Тут все от браузера зависит.. Поэтому вариант очень плохой, я с ним уже ломал голову давно, когда писал библиотек History-API
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #6 (permalink)  
Старый 11.05.2013, 17:31
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от qwerty-клавиатура
 
Регистрация: 12.04.2013
Сообщений: 132



// (#<identifier> rule)
function namedCaptures(re) { 
    var map = [];
    
    var ret = new RegExp( re.source.replace( /#<([^>]+)> /g, function(q, e) {
        map.push(e);        
        return '';
    } ), (re.global ? 'g' : '') + (re.ignoreCase ? 'i' : '') + (re.multiline  ? 'm' : '') ); 
    
    function assign(m) {
        if (m == null) {
            return m;
        }
        
        var i = map.length, j, o = {};
        
        while (i) {
            j = i;
            o[ map[--i] ] = m[j];
        }
        
        return o;
    }
    
    ret.exec = function(str) {
        return assign( RegExp.prototype.exec.call(this, str) );
    }
    
    return ret;
}
Ответить с цитированием
  #7 (permalink)  
Старый 11.05.2013, 18:33
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от qwerty-клавиатура
 
Регистрация: 12.04.2013
Сообщений: 132

// (#<identifier> rule)
// re = captureNames( /^(#<protocol> [^:]*:)\/\/(?:(#<user> [-+\w.]+)(?::(#<password> [-+\w.]+))@)?(#<hostname> (#<host> [^:\\/?#]+)(?::(#<port> \d+))?)(#<path> [/\\][^?#]*)?(#<search> \?[^#]*)?(#<hash> #.*)?$/ );
// console.log( re.group(location.href) );
function captureNames(re) { 
    var names = [];
    
    re = new RegExp( re.source.replace( /#<(\w{1,32})> /g, function(q, e) {
        names.push(e);        
        return '';
    } ), (re.global ? 'g' : '') + (re.ignoreCase ? 'i' : '') + (re.multiline  ? 'm' : '') );
    
    re.names = names;
    
    function assign(m) {
        if (m == null) {
            return m;
        }
        
        var i = re.names.length, j, o = {};
        
        while (i) {
            j = i;
            o[ re.names[--i] ] = m[j];
        }
        
        return o;
    }
    
    re.group = function(str) {
        return assign( re.exec(str) );
    }
    
    return re;
}

Последний раз редактировалось qwerty-клавиатура, 12.05.2013 в 03:24.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Регулярные выражения alex2012 Общие вопросы Javascript 5 23.02.2013 19:49
ООП головного мозга Gozar Серверные языки и технологии 134 25.12.2012 02:07
Регулярные выражения для javascript qwert_ukg Общие вопросы Javascript 3 20.04.2012 13:45
нежадные регулярные выражения KOLANICH Общие вопросы Javascript 2 12.12.2010 01:08
Функции поиска и замены строк или регулярные выражения? Armen Общие вопросы Javascript 1 01.01.2010 12:35