Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Регулярные выражения ? (https://javascript.ru/forum/jquery/2947-regulyarnye-vyrazheniya.html)

grusha 02.03.2009 20:51

Регулярные выражения ?
 
Есть такая строка

vote(2,23,1,'2750ee0fc11',-10)

Хотелось бы узнать как можно разделить её чтобы я мог обратиться к каждой переменной.
Код:

$a = 2
$b = 23
$c = 1
$d = 2750ee0fc11
$e = -10

Т.е. в этоге мне нужно получить такую строку

Код:

var mylink= "link=" + $a + "&id=" + $b + "&user=" + $c + "&md5=" + $d + "&value=" + $e;
Заранее благодарен.

Kolyaj 02.03.2009 21:38

Ход конем :)
function vote(a, b, c, d, e) {
    return "link=" + a + "&id=" + b + "&user=" + c + "&md5=" + d + "&value=" + e;
}

var str = "vote(2,23,1,'2750ee0fc11',-10)";
var mylink = eval(str);

grusha 02.03.2009 22:27

Цитата:

Сообщение от Kolyaj (Сообщение 13444)
Ход конем :)

:) в принципе работает , но это не то что мне надо...
Так как мне надо добавить в функцию еще пару значений.
т.е. функция будет примерна такая

function vote(a, b, c, d, e, value1 , value2) {
return "link=" + a + "&id=" + b + "&user=" + c + "&md5=" + d + "&value=" + e;
}

Было бы даже лучше , получить так же значение vote , т.е.

строка может быть
vote(2,23,1,'2750ee0fc11',-10)
а может
unvote(2,23,1,'2750ee0fc11',-10)

и если начинается с vote то будет работать одна функция , а если unvote то другая.
Но это конечно в идеале , а так мне бы очень помогло , хотя бы то что я написал в первом посте.

x-yuri 02.03.2009 22:32

а откуда вообще берется эта "vote(2,23,1,'2750ee0fc11',-10)" ?

grusha 02.03.2009 23:28

Цитата:

Сообщение от x-yuri (Сообщение 13453)
а откуда вообще берется эта "vote(2,23,1,'2750ee0fc11',-10)" ?

Переменная приходит именно в таком виде, конечно можно было бы изменить код откуда приходит переменная , но в данном случае это сделать нельзя :(

x-yuri 02.03.2009 23:57

1.откуда? Если от пользователя, то стоит задуматься над использованием eval
2. какие типы параметров могут быть? Может в строке присутствовать запятая? Строки могут быть ограничены только одинарными кавычками?

Kolyaj 03.03.2009 00:15

Цитата:

Сообщение от x-yuri
Если от пользователя, то стоит задуматься над использованием eval

Это же был ход конем :) я бы так делать не стал. А в каких случаях ты задумываешься над eval? И чем он опасен, если данные вводит пользователь?

grusha 03.03.2009 00:25

Цитата:

Сообщение от x-yuri (Сообщение 13471)
1.откуда? Если от пользователя, то стоит задуматься над использованием eval
2. какие типы параметров могут быть? Может в строке присутствовать запятая? Строки могут быть ограничены только одинарными кавычками?

В движке используется smartyphp и эта переменная приходит из файла vote.php , конечно я мог бы изменить файл vote.php, но в данной ситуации это не возможно.
Я думал что мою проблему можно решить с помощью "регулярного выражения", вот только не знаю как .....

x-yuri 03.03.2009 00:46

1. как эта переменная попадает в vote.php? от пользователя (через параметры запроса)?
2. какие типы параметров могут быть? Может в строке присутствовать запятая? Строки могут быть ограничены только одинарными кавычками?

Цитата:

Я думал что мою проблему можно решить с помощью "регулярного выражения", вот только не знаю как .....
можно, но если данные приходят не от пользователя - то проще без регулярных выражений

grusha 03.03.2009 00:53

Цитата:

Сообщение от x-yuri (Сообщение 13475)
1. как эта переменная попадает в vote.php? от пользователя (через параметры запроса)?
2. какие типы параметров могут быть? Может в строке присутствовать запятая? Строки могут быть ограничены только одинарными кавычками?


можно, но если данные приходят не от пользователя - то проще без регулярных выражений

Данные приходят не от пользователя.
Выражение всегда такое
vote(2,23,1,'2750ee0fc11',-10)
меняются только цифры.
Вообще это счетчик голосования за статью , как на сайте Digg.com (кнопка digg it).

grusha 03.03.2009 00:59

Нашёл такой способ , но это просто писец длинно !

jQuery('#my_link a').click(function(event) {
		var href_link = jQuery(this).attr('href');
		var link_test = substr(href_link, 5,-1);
		var link_test2 = explode( ',', link_test );
		alert(link_test2);
		return false;
  });

function explode( delimiter, string, limit ) {
 
    var emptyArray = { 0: '' };
    
    // third argument is not required
    if ( arguments.length < 2
        || typeof arguments[0] == 'undefined'
        || typeof arguments[1] == 'undefined' )
    {
        return null;
    }
 
    if ( delimiter === ''
        || delimiter === false
        || delimiter === null )
    {
        return false;
    }
 
    if ( typeof delimiter == 'function'
        || typeof delimiter == 'object'
        || typeof string == 'function'
        || typeof string == 'object' )
    {
        return emptyArray;
    }
 
    if ( delimiter === true ) {
        delimiter = '1';
    }
    
    if (!limit) {
        return string.toString().split(delimiter.toString());
    } else {
        // support for limit argument
        var splitted = string.toString().split(delimiter.toString());
        var partA = splitted.splice(0, limit - 1);
        var partB = splitted.join(delimiter.toString());
        partA.push(partB);
        return partA;
    }
}

function substr( f_string, f_start, f_length ) {
 
    f_string += '';
 
    if(f_start < 0) {
        f_start += f_string.length;
    }
 
    if(f_length == undefined) {
        f_length = f_string.length;
    } else if(f_length < 0){
        f_length += f_string.length;
    } else {
        f_length += f_start;
    }
 
    if(f_length < f_start) {
        f_length = f_start;
    }
 
    return f_string.substring(f_start, f_length);
}

x-yuri 03.03.2009 01:15

если ты уверен, что ни одна из параметров не приходит через параметры запроса (или не генерируется на основе параметров запроса), то можно просто добавить в строку нужные значения
s.replace(/\)/, value1+','+value2+')')

а потом eval

либо определить функцию и параметры можно с помощь такого регэкспа: /^(\w+)\(([^)]*)\)$/, а разбить строку параметров на составляющие можно с помощью split(',')

p.s. я бы скорее пользовался родными средствами javascript, чем портом php-функций
p.p.s. а ты думаешь, когда jQuery подключаешь, то там меньше кода?

grusha 03.03.2009 01:36

Цитата:

Сообщение от x-yuri (Сообщение 13478)

либо определить функцию и параметры можно с помощь такого регэкспа: /^(\w+)\(([^)]*)\)$/, а разбить строку параметров на составляющие можно с помощью split(',')

А можно подробнее , просто я в JavaScript новичок.
Цитата:

Сообщение от x-yuri (Сообщение 13478)
p.p.s. а ты думаешь, когда jQuery подключаешь, то там меньше кода?

Если бы я был "гуру" в JavaScript ,я бы может и не использовал jQuery .
Но в моём случем получается , что я знаю JavaScript , а он меня нет :)))

x-yuri 03.03.2009 01:57

Цитата:

А можно подробнее , просто я в JavaScript новичок
у строк есть метод match (принимает регулярное выражение в качестве параметра): str.match(/^regual expression$/)
что возвращает можно посмотреть, например, на вкладке Console Firebug'а
split - тоже метод строки, возвращает массив элементов после разбиения

подробное описание можно найти, например, здесь - http://javascript.ru/ecma/part15#a-15.5.4 (15.5.4.10, 15.5.4.14)
или здесь:
https://developer.mozilla.org/En/Cor...s/String/Split
https://developer.mozilla.org/en/Cor...s/String/match

grusha 03.03.2009 02:22

Попробовал так

jQuery('#my_link a').click(function(event) {
        var href_link = jQuery(this).attr('href');
		var title_link = jQuery(this).attr('title');
		var link_this = this;
		var re = /^(\w+)\(([^)]*)\)$/;
		var found = href_link.match(re);
				 alert(found);
        return false;
  });


Алертом выводит
vote(2,23,1,'2750ee0fc11',-10),2,23,1,'2750ee0fc11',-10
Чтобы удалить не нужное мне теперь vote(2,23,1,'2750ee0fc11',-10),, надо еще что то использовать ?

x-yuri 03.03.2009 02:29

alert (а точнее преобразование в строку) предоставляет не очень подробную информацию. По идее это должен был быть массив из 3х элементов: ["vote(2,23,1,'2750ee0fc11',-10)","vote", "2,23,1,'2750ee0fc11',-10"]

grusha 03.03.2009 02:43

Цитата:

Сообщение от x-yuri (Сообщение 13482)
alert (а точнее преобразование в строку) предоставляет не очень подробную информацию. По идее это должен был быть массив из 3х элементов: ["vote(2,23,1,'2750ee0fc11',-10)","vote", "2,23,1,'2750ee0fc11',-10"]

ОК.
дальше больше :)

jQuery('#my_link a').click(function(event) {
        var href_link = jQuery(this).attr('href');
        var title_link = jQuery(this).attr('title');
        var link_this = this;
        var re = /^(\w+)\(([^)]*)\)$/;
        var found = href_link.match(re);
                 alert(found);
        var myString = ""+found+"";
        var splits = myString.split(",", 30);
        alert(splits);
        return false;
  });


Второй алерт выдаёт точно тоже что и первый .
И еще , даже если всё ок то как мне обратиться ,скажем, ко второму элементу массива ?

x-yuri 03.03.2009 02:51

found - массив найденных вхождений. Элемент 0 - соответствие всему шаблону (^(\w+)\(([^)]*)\)$), 1 - первому подшаблону (\w+), 2 - второму ([^)]*)
Массив преобразуется в строку следующим образом: [1,2,3] -> '1,2,3'. Если написать в строке браузера 'javascript:[1,2,3]' то мы это увидим в действии. Это по поводу ""+found+""
Для чего ты используешь split(',') ? И зачем тебе, кстати, лимит (30) ?

Цитата:

И еще , даже если всё ок то как мне обратиться ,скажем, ко второму элементу массива ?
array[1]

grusha 03.03.2009 03:10

Цитата:

Сообщение от x-yuri (Сообщение 13485)
Для чего ты используешь split(',') ? И зачем тебе, кстати, лимит (30) ?

Я так понял , что я по (,) запятой , делаю массив, лимит 30 это я так для пробы.делал лимит 3 , тогда во втором алерте нарезает эту строку
vote(2,23,1,'2750ee0fc11',-10)
и выдаёт
vote(2,23,1

Яж говорю я в JavaScript новичёк.

x-yuri 03.03.2009 03:15

Цитата:

Я так понял , что я по (,) запятой , делаю массив
да, но что по-твоему в myString или что ты думаешь там находится?
когда придумаешь, зачем тебе лимит - тогда можешь использовать

grusha 03.03.2009 03:54

Цитата:

Сообщение от x-yuri (Сообщение 13489)
да, но что по-твоему в myString или что ты думаешь там находится?
когда придумаешь, зачем тебе лимит - тогда можешь использовать

Я так представлял себе ...
Первый код преобразует эту строку
vote(2,23,1,'2750ee0fc11',-10)
в
vote,2,23,1,'2750ee0fc11',-10

А второй код делает из этой строки массив , разделяю переменные по запятой......

Сейчас попробовал такой код

jQuery('#my_link a').click(function(event) {
        var href_link = jQuery(this).attr('href');
        var title_link = jQuery(this).attr('title');
        var link_this = this;
        var re = /^(\w+)\(([^)]*)\)$/;
        var found = href_link.match(re);
                 alert(found);
       var myString = ""+found+"";
	var splits = myString.split(",");
	alert(splits[5]);
        return false;
  });


Впринципе выдаёт то что мне надо , только начиная с 5...
5 возврашает vote
6 возврашает 2
7 возврашает 23
8 возврашает 1
9 возврашает 2750ee0fc11

и т.д.

x-yuri 03.03.2009 12:17

Цитата:

Первый код преобразует эту строку
vote(2,23,1,'2750ee0fc11',-10)
в
vote,2,23,1,'2750ee0fc11',-10
должен преобразовывать в массив из 3х элементов (см. выше). Воспользуйся Firefox + Firebug - он выдает более точную информацию о переменных. Или отладчиком IE

как у тебя получилось начиная с 5го элемента - не понял O_o

grusha 03.03.2009 15:10

Цитата:

Сообщение от x-yuri (Сообщение 13505)
должен преобразовывать в массив из 3х элементов (см. выше). Воспользуйся Firefox + Firebug - он выдает более точную информацию о переменных. Или отладчиком IE

как у тебя получилось начиная с 5го элемента - не понял O_o

Firefox + Firebug давно пользуюсь , но где посмотреть этот массив не понимаю..... Вкладка DOM ?
Если я вызываю алерт :

alert(splits[0]) возврашает vote(2
alert(splits[1]) возврашает 23
alert(splits[2]) возврашает 1
alert(splits[3]) возврашает 2750ee0fc11
alert(splits[4]) возврашает -10)

С пятого всё нормально идёт...

grusha 03.03.2009 15:26

и всё таки даже если использовать этот код начиная с 5....
то всё равно не проходит так как один из элементов остаётся в одинарных кавычках '2750ee0fc11', получается теперь еще кавычки надо убрать !
Это просто писец :)

x-yuri 03.03.2009 17:21

Цитата:

Firefox + Firebug давно пользуюсь , но где посмотреть этот массив не понимаю
на вкладке Console можно вычислять выражения. Например, чтобы узнать, что ты получишь в результате match, напиши в ней
"vote(2,23,1,'2750ee0fc11',-10)".match(/^(\w+)\(([^)]*)\)$/)

Еще вместо alert можно в скрипте писать
console.log( "vote(2,23,1,'2750ee0fc11',-10)".match(/^(\w+)\(([^)]*)\)$/) )

и опять же результат попадет во вкладку Console

Цитата:

С пятого всё нормально идёт...
теперь все понятно. А зачем ты регулярное выражение использовал? я думал, чтобы получить название функции (vote/unvote) и ее аргументы (2,23,1,'2750ee0fc11',-10), а вот уже аргументы разбивать по запятой

Цитата:

получается теперь еще кавычки надо убрать
так это же строка. Но если надо убрать и ты уверен, что они всегда будут, выбирай:
str.substring(1, str.length-1)
str.replace("'",'')
str.replace("'",'').replace('"','')
str.replace(/^('|")/, '').replace(/('|")$/, '')

grusha 03.03.2009 17:53

Огромное спасибо. Теперь работает.
Код такой:
jQuery('#my_link a').click(function(event) {
        var href_link = jQuery(this).attr('href');
        var title_link = jQuery(this).attr('title');
        var link_this = this;
        var re = /^(\w+)\(([^)]*)\)$/;
	var found = href_link.match(re);
	var myString = ""+found+"";
	var splits = myString.split(",");
	var splits9 = splits[9].replace(/^('|")/, '').replace(/('|")$/, '');
	vote(splits[6], splits[7], splits[8], splits9, splits[10], link_this,title_link);
		
		return false;
  });


Длинноват как то конечно :)

x-yuri 03.03.2009 18:14

var myString = ""+found+"";
    var splits = myString.split(",");
    var splits9 = splits[9].replace(/^('|")/, '').replace(/('|")$/, '');

а почему бы не сделать так:
var els = found[2].split(',');
var el3 = els[3].replace(/('|")/g)

replace(/('|")/g) - думаю можно и так, кавычки ведь скорее всего только ограничивать строку будут? В середине вряд ли будут присутствовать?

this не обязательно в link_this копировать

grusha 03.03.2009 18:44

Цитата:

Сообщение от x-yuri (Сообщение 13562)
а почему бы не сделать так:
[js]var els = found[2].split(',');
var el3 = els[3].replace(/('|")/g)

replace(/('|")/g) - думаю можно и так, кавычки ведь скорее всего только ограничивать строку будут? В середине вряд ли будут присутствовать?

Если использовать этот код

var el3 = els[3].replace(/('|")/g)

То опять возникает ошибка
undefined2750ee0fc11undefined
Почему то вместо кавычек вставляется текст undefined

Цитата:

Сообщение от x-yuri (Сообщение 13562)
this не обязательно в link_this копировать

Всмысле просто передать в функцию this а не link_this
?

grusha 03.03.2009 18:48

А ок понял , если написать так
var el3 = els[3].replace(/('|")/g,'')

Тогда всё ок.
Привожу код полностью , может комуто потом пригодится
jQuery('#my_link a').click(function(event) {
        var href_link = jQuery(this).attr('href');
        var title_link = jQuery(this).attr('title');
        var link_this = this;
        var re = /^(\w+)\(([^)]*)\)$/;
		var found = href_link.match(re);
		var splits = found[2].split(',');
		var el9 = splits[3].replace(/('|")/g,'');
		vote(splits[0], splits[1], splits[2], el9, splits[4], link_this,title_link);
 
        return false;
  });

x-yuri 03.03.2009 19:00

Цитата:

Всмысле просто передать в функцию this а не link_this
именно

p.s. found[1] будет содержать название функции (ты еще unvote хотел)

grusha 03.03.2009 19:06

Цитата:

Сообщение от x-yuri (Сообщение 13572)
p.s. found[1] будет содержать название функции (ты еще unvote хотел)

Да именно так .
Спасибо тебе !

x-yuri 03.03.2009 19:09

а еще можно так:
var splits = found[2].split(',');
        splits[3] = splits[3].replace(/('|")/g,'');
        splits.push( this,title_link );
        vote.apply( window, splits );

скорее говори "тема закрыта", а то сейчас вариантами засыплю :yes:

grusha 03.03.2009 20:31

Цитата:

Сообщение от x-yuri (Сообщение 13575)
а еще можно так:
var splits = found[2].split(',');
        splits[3] = splits[3].replace(/('|")/g,'');
        splits.push( this,title_link );
        vote.apply( window, splits );

скорее говори "тема закрыта", а то сейчас вариантами засыплю :yes:

:) В принципе пока и так пойдёт, дальше буду подключать другие функции, надеюсь там всё пройдет проще , чем 4 страници на форуме :)
Ради интереса , что делают эти две строки ?

splits.push( this,title_link );
vote.apply( window, splits );

x-yuri 03.03.2009 21:16

push - метод, который добавляет элемент в массив
apply - метод, который вызывает функцию в контексте первого параметра (т.е. в функции this будет указывать на window) и передает ей массив параметров splits

grusha 03.03.2009 22:29

Спасибо еще раз !


Часовой пояс GMT +3, время: 09:46.