 
			
				14.05.2009, 12:31
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 14.05.2009 
					
					
					
						Сообщений: 30
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
			
			 
				Регулярка работает через раз.
			 
			
		
		
		
		Помогите пожалуйста отловить баг.  
<script>
//-------------------------------------------------------------
var tshto_bylo = 'COLOR: #aaaaaa;color: #bbbbbb;color: #cccccc;color: #dddddd;color: #eeeeee;color: #ffffff"';
var tshto_najti = 'color';
var zamenjaemoe_znatshenie = 'test_projden';
//-------------------------------------------------------------
var reg = new RegExp('((^|;)\\s*)' + tshto_najti + '(\\s*:\\s*)([^;]*)((;)|$)','gi');
//((^|;)\s*)-начало строки или символ ";", за которыми могут быть пробелы
//(все это запомню и вставлю как подстроку "$1")
//(\s*:\s*)-возможные пробелы, за которым(и) идет символ ":", после чего опять возможны пробелы
//(все это запомню и вставлю как подстроку "$3")
//([^;]*)-возможен любой набор символов, кроме символа ";"
//((;)|$)-символ ";" или конец строки
//(символ ";" -если он есть - запомню и вставлю как подстроку "$6")
if (reg.test(tshto_bylo))
//--есть параметр, заменяю
{
var tshto_stalo = tshto_bylo.replace(reg,'$1' + tshto_najti + '$3' + zamenjaemoe_znatshenie + '$6');
}
window.alert(tshto_stalo);
</script>
 
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				14.05.2009, 12:44
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Рассеянный профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 06.04.2009 
					
					
					
						Сообщений: 2,379
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Так? 
//-------------------------------------------------------------
var tshto_bylo = 'COLOR: #aaaaaa;color: #bbbbbb;color: #cccccc;color: #dddddd;color: #eeeeee;color: #ffffff"';
	 
var tshto_najti = 'color';
	 
var zamenjaemoe_znatshenie = 'test_projden';
//-------------------------------------------------------------
	 
	 
var reg = new RegExp('((^|;)\\s*)' + tshto_najti + '(\\s*:\\s*)([^;]*)(?=(;)|$)','gi');
if (reg.test(tshto_bylo)) {
	var tshto_stalo = tshto_bylo.replace(reg,'$1' + tshto_najti + '$3' + zamenjaemoe_znatshenie);
}
alert(tshto_stalo);
 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				14.05.2009, 12:49
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Новичок на форуме 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 19.02.2008 
					
					
					
						Сообщений: 9,177
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
//-------------------------------------------------------------
var tshto_bylo = 'COLOR: #aaaaaa;color: #bbbbbb;color: #cccccc;color: #dddddd;color: #eeeeee;color: #ffffff"';
 
var tshto_najti = 'color';
 
var zamenjaemoe_znatshenie = 'test_projden';
//-------------------------------------------------------------
 
 
var reg = new RegExp('((^|;)\\s*)' + tshto_najti + '(\\s*:\\s*)([^;]*)','gi');
 
//((^|;)\s*)-начало строки или символ ";", за которыми могут быть пробелы
//(все это запомню и вставлю как подстроку "$1")
 
 
//(\s*:\s*)-возможные пробелы, за которым(и) идет символ ":", после чего опять возможны пробелы
//(все это запомню и вставлю как подстроку "$3")
 
//([^;]*)-возможен любой набор символов, кроме символа ";"
 
//((;)|$)-символ ";" или конец строки
//(символ ";" -если он есть - запомню и вставлю как подстроку "$6")
 
if (reg.test(tshto_bylo))
//--есть параметр, заменяю
{
var tshto_stalo = tshto_bylo.replace(reg,'$1' + tshto_najti + '$3' + zamenjaemoe_znatshenie);
}
 
window.alert(tshto_stalo);
 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				14.05.2009, 20:53
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 14.05.2009 
					
					
					
						Сообщений: 30
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Ребята, спасибо большое! Очень выручили! И первый, и второй варианты работают. А я все ломал голову, что не так сделал. Выкинул последнюю проверку вообще нафиг, т.к. знак ";" в моем случае не кретичен., а в другом месте его вообще пустил "под нож". Я не совсем (вернее, "совсем не") разбираюсь в JS, дохожу до всего методом проб и ошибок. Вот например такую же регулярку пытаюсь использовать для обратной задачи: в заданном тексте найти нужный параметр и взять его значение, которое упоминается последним (если параметр по ошибке написан несколько раз). Перепробовал все что прочитал, все не получается. В результате тупо прошелся регулярками и получил код, от которого самому стало страшно. Код работает, но не совсем: берет не последнее упоминание, а первое. Пробовал использовать в  reg_2  ?!, но не получается. Пока рабочий вариант такой: (Просьба ногами не пинать, я еще только изучаю JS): 
<script>
var text_stilja = 'COLOR: #aaaaaa;color: #bbbbbb;background-color: #xxxxxx;color: #cccccc;color: #dddddd;';
var tshto_najti = 'color';
var rezultat_3= '';//--по умолчанию пустой
var reg = new RegExp('((^|;)\\s*)' + tshto_najti + '(\\s*:\\s*)([^;]*)','gi');
   if (reg.test(text_stilja))
   //--есть параметр, заменяю
   {
     var rezultat_1= text_stilja.replace(reg,'<<<<<$4>>>>>');
      var reg_2 = new RegExp('(([^<]*)(<<<<<([^>]*)>>>>>)(.*))','i');
      var rezultat_2= rezultat_1.replace(reg_2,'<<<<<$3>>>>>');
      var reg_3 = new RegExp('(<|>)','g');
      rezultat_3= rezultat_2.replace(reg_3,'');
   }
      window.alert('Что было: \n\n'+text_stilja+'\n\n\n\n После первой регулярки (экранирую значения нужного мне параметра): \n\n'+rezultat_1+'\n\n\n\n После второй регулярки (надо взять последнее упоминание, отсекая все лишнее; как и в браузере, последнее определение одного и того же самое важное): \n\n'+rezultat_2+'\n\n\n\n После третьей регулярки (убираю экранирование): \n\n'+rezultat_3);
</script>
Пробовал reg_2 сделать так:
 
var reg_2 = new RegExp('(([^<]*)(<<<<<([^>]*)>>>>>)(?!([^<]*)<<<<<)([^>]*))','gi');
но не вышло. Как можно такое сделать?  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось Andrej_2, 14.05.2009 в 21:08.
				Причина: Опечатка в коде
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				14.05.2009, 21:18
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Новичок на форуме 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 19.02.2008 
					
					
					
						Сообщений: 9,177
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Andrej_2
			
		
	 | 
 
	| 
		в заданном тексте найти нужный параметр и взять его значение, которое упоминается последним (если параметр по ошибке написан несколько раз)
	 | 
 
	
 
 Сначала не до конца понял задачу, и сделал для случая, если нужно удалить повторяющиеся описания.
 
var text_stilja = 'COLOR: #aaaaaa;color: #bbbbbb;background-color: #xxxxxx;color: #cccccc;color: #dddddd; BACKGROUND-COLOR: #FFF';
var styleNames = {};
alert(text_stilja.replace(/([-a-z]+):([^;]*);?/ig, function(match, name) {
    name = name.toLowerCase();
    if (styleNames[name]) {
        return '';
    } else {
        styleNames[name] = true;
        return match;
    }
}))
А для вашего случая: 
var text_stilja = 'COLOR: #aaaaaa;color: #bbbbbb;background-color: #xxxxxx;color: #cccccc;color: #dddddd   ; BACKGROUND-COLOR: #FFF';
var match = text_stilja.match(/.*(?:^|;)\s*color:\s*([^;]*)/i);
if (match)
    alert('"' + match[1] + '"');
 Только тут правые пробелы у значения обрезаться не будут.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				14.05.2009, 21:33
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 14.05.2009 
					
					
					
						Сообщений: 30
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Да! Чувствуется рука профессионала! Снимаю шляпу! 
Только вот у меня с match и пр. никак не получалось именно потому, что не мог вставить переменную. Т.е. вместо color должна быть tshto_najti . А в таком случае
 
var match = text_stilja.match(/'.*(?:^|;)\s*' + tshto_najti + ':\s*([^;]*)'/i);
 
уже не работает.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				14.05.2009, 22:34
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Новичок на форуме 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 19.02.2008 
					
					
					
						Сообщений: 9,177
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
var match = text_stilja.match(new RegExp('.*(?:^|;)\\s*' + tshto_najti + ':\\s*([^;]*)', 'i'));
 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				15.05.2009, 12:20
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 03.04.2009 
					
					
					
						Сообщений: 1,263
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		только желательно квотить переменную tshto_najti, а то она вполне может оказаться "похожей" на регулярку. Примерно так: 
var qReg = new RegExp(preg_quote(q), 'i');
function preg_quote(str) {
    if (!str||str.constructor!=String) return '';
    return str.replace(/([\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:])/g, "\\$1");
}
 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				15.05.2009, 15:33
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Рассеянный профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 06.04.2009 
					
					
					
						Сообщений: 2,379
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от e1f
			
		
	 | 
 
	| 
		\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:
	 | 
 
	
 
 У меня так:
 
RegExp.escape = function(str) {
	return (str + '').replace(/([?!^$.(){}:|=[\]+\-\/\\*])/g, '\\$1');
};
Разница такая: 
у вас нет символов "-" и "/" 
у меня нет "<" и ">"
 
Необходимость в символах "-" и "/" могу доказать на конкретных примерах, где их отсутствие приведет к неправильной работе создаваемой регулярки. Или можете просто поверить на слово и добавить их себе.
 
Можете обосновать символы "<" и ">" ?  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				15.05.2009, 17:18
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 03.04.2009 
					
					
					
						Сообщений: 1,263
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Да, "<" и ">" явно лишние, ступил я где-то. "-" где может покромсать - знаю, добавил себе    А вот насчет "/"... Можете привести пример?  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |