Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.01.2011, 19:07
Новичок на форуме
Отправить личное сообщение для Askhsiv_1 Посмотреть профиль Найти все сообщения от Askhsiv_1
 
Регистрация: 20.12.2009
Сообщений: 8

оптимизация множественной замены и поиска (регулярные выражения)
Здравствуй Олл, всезнающий и всемогущий

есть 2 момента в коде, которые хотелось бы оптимизировать, прошу помочь

номер раз: множественная замена в строке элементами массива

дано
xx = "text|aaaa|text text|cccc| texttext |bbbb|text |cccc| text |aaaa|text text|dddd|text"

yy = {aaaa:'_w1_', bbbb:'_w2_', cccc:'_w3_', dddd:'_w4_'}

надо все встречающиеся в строке xx конструкции |слово| заменить на значения массива yy с одноимённым ключом

сначала я по неопытности делал так:
r1 = xx.replace(/\|aaaa\|/g, yy.aaaa);
r2 = r1.replace(/\|bbbb\|/g, yy.bbbb);
r3 = r2.replace(/\|cccc\|/g, yy.cccc);
zz = r3.replace(/\|dddd\|/g, yy.dddd);

разумеется всё работает, но... сами понимаете)

потом я вспомнил как в PHP можно заменять элементы одного массива соответствующими элементами другого,
жаль в JS такого нету. почитал про Спецсимволы в строке замены и попробовал так:
zz = xx.replace(/\|(\w*)\|/g, yy['$1']);

но ничего не вышло. вставляет undefined вместо того что надо.
кстати кто может объяснить посему?

потом почитал про Замену через функцию и сделал так:
function replacer(str, p) { return str.replace(/\|\w*\|/, '') + yy[p] } 

zz = xx.replace(/\|(\w*)\|/g, replacer)

потом подумал получше и сделал так:
function replacer(s, p1, p2) { return p1+yy[p2] }

zz = xx.replace(/([^\|]*)\|(\w*)\|/g, replacer)

оба варианта работают, но есть стойкое ощущение, что что-то упустил и можно сделать проще и лучше

для удобства проверки:
document.write(xx+'<br>'+zz)



номер два: соответствие в поиске для начала/конца строки или другого спецсимвола

допустим надо в cookies найти значение какой-нибудь куки.
варианты строки cookies могут быть такими:

- aaa=111
- aaa=111; bbb=222
- bbb=222; aaa=111
- bbb=222; aaa=111; ccc=333

то есть наша кука может быть одна, в начале, в конце и в середине строки
чтобы узнать её значение пишу регулярку:
cooka = /aaa=[^;]*;|aaa=[^;]*$/.exec(document.cookie);

zz = cooka[0].replace(/aaa=|;/g, '');

меня тут смущает это: /.....x|.....$/ где x - любой символ или спецсимвол, ..... - одинаковые выражения
тоже самое и с началом строки, ну не умею я с ними или делать, когда они уже часть выражения


может у кого-то есть мысли как можно оптимизировать вышеописанные решения

Последний раз редактировалось Askhsiv_1, 16.01.2011 в 19:14.
Ответить с цитированием
  #2 (permalink)  
Старый 16.01.2011, 20:10
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,495

1.
var x = "text|aaaa|text text|cccc| text|none|text |bbbb|text |cccc| text |aaaa|text text|dddd|text"
var y = {aaaa:'_w1_', bbbb:'_w2_', cccc:'_w3_', dddd:'_w4_'}
alert( x.replace(/\|(\w*?)\|/g, function(a,b){ return y[b]||a } ) )



2.
http://javascript.ru/unsorted/top-10...e-deletecookie
Ответить с цитированием
  #3 (permalink)  
Старый 16.01.2011, 21:59
Новичок на форуме
Отправить личное сообщение для Askhsiv_1 Посмотреть профиль Найти все сообщения от Askhsiv_1
 
Регистрация: 20.12.2009
Сообщений: 8

Aetae

класс, особенно первое)

а второе, я вместо большой навороченной функции из ссылки написал решение своего вопроса основанное на ней:
matches = /lang=([^;]*)/.exec(document.cookie)
cooka = matches[1]


благодарю
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функции поиска и замены строк или регулярные выражения? Armen Общие вопросы Javascript 1 01.01.2010 12:35
Автоматизация поиска Newbie_ Общие вопросы Javascript 4 20.12.2009 23:59
Помогите создать скрипт замены картинок при наведении курсора. SantaS Я не знаю javascript 3 05.06.2009 12:59
Форма поиска Владимир Новицкий Элементы интерфейса 4 21.01.2009 02:32