Регулярные выражения ?
Есть такая строка
vote(2,23,1,'2750ee0fc11',-10) Хотелось бы узнать как можно разделить её чтобы я мог обратиться к каждой переменной. Код:
$a = 2Код:
var mylink= "link=" + $a + "&id=" + $b + "&user=" + $c + "&md5=" + $d + "&value=" + $e; |
Ход конем :)
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);
|
Цитата:
Так как мне надо добавить в функцию еще пару значений. т.е. функция будет примерна такая 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 то другая. Но это конечно в идеале , а так мне бы очень помогло , хотя бы то что я написал в первом посте. |
а откуда вообще берется эта "vote(2,23,1,'2750ee0fc11',-10)" ?
|
Цитата:
|
1.откуда? Если от пользователя, то стоит задуматься над использованием eval
2. какие типы параметров могут быть? Может в строке присутствовать запятая? Строки могут быть ограничены только одинарными кавычками? |
Цитата:
|
Цитата:
Я думал что мою проблему можно решить с помощью "регулярного выражения", вот только не знаю как ..... |
1. как эта переменная попадает в vote.php? от пользователя (через параметры запроса)?
2. какие типы параметров могут быть? Может в строке присутствовать запятая? Строки могут быть ограничены только одинарными кавычками? Цитата:
|
Цитата:
Выражение всегда такое vote(2,23,1,'2750ee0fc11',-10) меняются только цифры. Вообще это счетчик голосования за статью , как на сайте Digg.com (кнопка digg it). |
Нашёл такой способ , но это просто писец длинно !
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);
}
|
если ты уверен, что ни одна из параметров не приходит через параметры запроса (или не генерируется на основе параметров запроса), то можно просто добавить в строку нужные значения
s.replace(/\)/, value1+','+value2+')') а потом eval либо определить функцию и параметры можно с помощь такого регэкспа: /^(\w+)\(([^)]*)\)$/, а разбить строку параметров на составляющие можно с помощью split(',') p.s. я бы скорее пользовался родными средствами javascript, чем портом php-функций p.p.s. а ты думаешь, когда jQuery подключаешь, то там меньше кода? |
Цитата:
Цитата:
Но в моём случем получается , что я знаю JavaScript , а он меня нет :))) |
Цитата:
что возвращает можно посмотреть, например, на вкладке 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 |
Попробовал так
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),, надо еще что то использовать ? |
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;
});
Второй алерт выдаёт точно тоже что и первый . И еще , даже если всё ок то как мне обратиться ,скажем, ко второму элементу массива ? |
found - массив найденных вхождений. Элемент 0 - соответствие всему шаблону (^(\w+)\(([^)]*)\)$), 1 - первому подшаблону (\w+), 2 - второму ([^)]*)
Массив преобразуется в строку следующим образом: [1,2,3] -> '1,2,3'. Если написать в строке браузера 'javascript:[1,2,3]' то мы это увидим в действии. Это по поводу ""+found+"" Для чего ты используешь split(',') ? И зачем тебе, кстати, лимит (30) ? Цитата:
array[1] |
Цитата:
vote(2,23,1,'2750ee0fc11',-10) и выдаёт vote(2,23,1 Яж говорю я в JavaScript новичёк. |
Цитата:
когда придумаешь, зачем тебе лимит - тогда можешь использовать |
Цитата:
Первый код преобразует эту строку 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 и т.д. |
Цитата:
как у тебя получилось начиная с 5го элемента - не понял O_o |
Цитата:
Если я вызываю алерт : alert(splits[0]) возврашает vote(2 alert(splits[1]) возврашает 23 alert(splits[2]) возврашает 1 alert(splits[3]) возврашает 2750ee0fc11 alert(splits[4]) возврашает -10) С пятого всё нормально идёт... |
и всё таки даже если использовать этот код начиная с 5....
то всё равно не проходит так как один из элементов остаётся в одинарных кавычках '2750ee0fc11', получается теперь еще кавычки надо убрать ! Это просто писец :) |
Цитата:
"vote(2,23,1,'2750ee0fc11',-10)".match(/^(\w+)\(([^)]*)\)$/) Еще вместо alert можно в скрипте писать console.log( "vote(2,23,1,'2750ee0fc11',-10)".match(/^(\w+)\(([^)]*)\)$/) ) и опять же результат попадет во вкладку Console Цитата:
Цитата:
str.substring(1, str.length-1)
str.replace("'",'')
str.replace("'",'').replace('"','')
str.replace(/^('|")/, '').replace(/('|")$/, '')
|
Огромное спасибо. Теперь работает.
Код такой:
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;
});
Длинноват как то конечно :) |
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 копировать |
Цитата:
var el3 = els[3].replace(/('|")/g)
То опять возникает ошибка undefined2750ee0fc11undefined Почему то вместо кавычек вставляется текст undefined Цитата:
? |
А ок понял , если написать так
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;
});
|
Цитата:
p.s. found[1] будет содержать название функции (ты еще unvote хотел) |
Цитата:
Спасибо тебе ! |
а еще можно так:
var splits = found[2].split(',');
splits[3] = splits[3].replace(/('|")/g,'');
splits.push( this,title_link );
vote.apply( window, splits );
скорее говори "тема закрыта", а то сейчас вариантами засыплю :yes: |
Цитата:
Ради интереса , что делают эти две строки ? splits.push( this,title_link ); vote.apply( window, splits ); |
push - метод, который добавляет элемент в массив
apply - метод, который вызывает функцию в контексте первого параметра (т.е. в функции this будет указывать на window) и передает ей массив параметров splits |
Спасибо еще раз !
|
| Часовой пояс GMT +3, время: 06:45. |