Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 26.03.2013, 14:36
Аспирант
Отправить личное сообщение для yngwie19 Посмотреть профиль Найти все сообщения от yngwie19
 
Регистрация: 24.10.2009
Сообщений: 39

rgl, Спасибо Вам большое за решение, подскажите есть ли еще какие-нибудь подводные камни вроде строк: ?
console.log("this._oData[sKey]");
Мне нужно заменить только реальные свойства и методы
Ответить с цитированием
  #12 (permalink)  
Старый 26.03.2013, 15:49
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

this['_oData']

Это тоже будет заменено или нет?
Ответить с цитированием
  #13 (permalink)  
Старый 26.03.2013, 15:57
Аспирант
Отправить личное сообщение для yngwie19 Посмотреть профиль Найти все сообщения от yngwie19
 
Регистрация: 24.10.2009
Сообщений: 39

Нет это менять не надо, думаю так правильно использовать. Поправьте пожалуйста регулярку
Ответить с цитированием
  #14 (permalink)  
Старый 26.03.2013, 15:58
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Сообщение от yngwie19 Посмотреть сообщение
подскажите есть ли еще какие-нибудь подводные камни вроде строк: ?
console.log("this._oData[sKey]");
Мне нужно заменить только реальные свойства и методы
Сообщение от danik.js Посмотреть сообщение
this['_oData']

Это тоже будет заменено или нет?
Составить безупречную регулярку очень сложно, и она будет большая и запутанная. Классики (напр. Jeffrey Friedl) учат нас искать компромисс между безупречностью и простотой.
Мое выражение споткнется, напр. на такой строке:
/* this isn't good */ _test = 0; console.log( '_test = 0' );

оно не заменит настоящую переменную, но заменит слово внутри строки. Поэтому для полной уверенности стоит сравнить исходный файл и файл с результатами и убедиться что все замены сделаны правильно.
Ответить с цитированием
  #15 (permalink)  
Старый 26.03.2013, 16:03
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Сообщение от danik.js Посмотреть сообщение
this['_oData']

Это тоже будет заменено или нет?
Это вообще не решаемо, т.к., если пойти дальше тем же путем, то следующим будет вопрос:
var i = '_oData';
// несколько строчек кода
this[i];
Ответить с цитированием
  #16 (permalink)  
Старый 26.03.2013, 16:08
Аспирант
Отправить личное сообщение для yngwie19 Посмотреть профиль Найти все сообщения от yngwie19
 
Регистрация: 24.10.2009
Сообщений: 39

rgl, можем ли с Вам пообщаться в каком-нибудь чате, у меня есть пара вопросов
Например: http://learn.javascript.ru/chat мой ник тот же

Последний раз редактировалось yngwie19, 26.03.2013 в 16:10.
Ответить с цитированием
  #17 (permalink)  
Старый 26.03.2013, 16:18
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Поправлено с учетом возможный комментариев:
var re = /(?:(?:\/\/.*)|(?:\/\*[\s\S]*?\*\/)|"(?:\\.|[^"])*"|'(?:\\.|[^'])*')|(\b_\w*)/g;
Ответить с цитированием
  #18 (permalink)  
Старый 26.03.2013, 16:23
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Нет, в чате общаться не получается. А чем форум плох? Много читателей снижают вероятность, что какая-то ошибка останется незамеченной.
Ответить с цитированием
  #19 (permalink)  
Старый 26.03.2013, 16:48
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от rgl Посмотреть сообщение
Как найти что-то, но не найти его, если оно внутри кавычек? Очень просто, нужно сначала найти все, что в кавычках, и тогда оно будет исключено из дальнейшего поиска.
Как найти то, что в кавычках? Найти открывающую кавычку, найти все что угодно, но только не кавычку, найти закрывающую кавычку.
В результате получаем "[^"]*" У этого выражения есть один недостаток - оно замаскированную кавычку по ошибке примет за закрывающую. Чтобы этого не произошло, придется его слегка усложнить:
"(\\.|[^"])*" - т.е. либо не-кавычка, либо замаскированный любой символ (в т.ч. возможно и кавычка). (Порядок тут важен, сначала замаскированноечтоугодно, а потом - не кавычка, менять нельзя) Чтобы результат в скобочках не "захватывался", добавляем вопрос с двоеточием
"(?:\\.|[^"])*"
Потом все то же самое повторяем с одинарными кавычками
/(["'])(?:\1|.*?[^\\]\1)/g - сразу учитываются одинарные и двойные кавычки (применяются ссылки на подстроки \1), ложные кавычки тоже

ЗЫ: вот так у меня сделано в парсере моего шаблонизатора
/**
 * Заметить кавычки с содержимом в строке на ссылку:
 * __SNAKESKIN_QUOT__номер
 *
 * @private
 * @param {string} str - исходная строка
 * @param {Array=} [opt_stack] - массив для подстрок
 * @return {string}
 */
Snakeskin._escape = function (str, opt_stack) {
	return str.replace(/(["'])(?:\1|.*?[^\\]\1)/g, function (sstr) {
		if (opt_stack) {
			opt_stack.push(sstr);
		}

		return '__SNAKESKIN_QUOT__' + (opt_stack ? opt_stack.length - 1 : '_');
	});
};

/**
 * Заметить __SNAKESKIN_QUOT__номер в строке на реальное содержимое
 *
 * @private
 * @param {string} str - исходная строка
 * @param {!Array} stack - массив c подстроками
 * @return {string}
 */
Snakeskin._uescape = function (str, stack) {
	return str.replace(/__SNAKESKIN_QUOT__(\d+)/g, function (sstr, pos) {
		return stack[pos];
	});
};
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 26.03.2013 в 16:56.
Ответить с цитированием
  #20 (permalink)  
Старый 26.03.2013, 17:05
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Сообщение от kobezzza
/(["'])(?:\1|.*?[^\\]\1)/g - сразу учитываются одинарные и двойные кавычки (применяются ссылки на подстроки \1), ложные кавычки тоже
Споткнется (не заметит закрывающую кавычку) если перед ней стоит замаскированный обратный слэш, напр.
var s = "abcd\\";
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите, пжлста, найти (или написать) скрипт для смены картинок. Artweb Работа 9 25.02.2011 11:28
dragSelector для iframe помогите написать Golizart ExtJS 0 25.07.2010 15:35
Помогите написать скрипт для корзины Deep Элементы интерфейса 1 19.06.2010 14:46
Помогите со скриптом для onClick! Alex13 Общие вопросы Javascript 1 04.11.2009 10:36