Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.05.2013, 19:41
Аспирант
Отправить личное сообщение для Neznayka Посмотреть профиль Найти все сообщения от Neznayka
 
Регистрация: 08.03.2013
Сообщений: 37

Замена подстрок в строке
Добрый день.
Есть несколько строк :
1) Мама мыла раму
2) Раму мыла мама
3) Мыла мама раму
и есть подстрока :
1) Как хорошо мыла раму мама
Необходимо :
Найти в строках вхождение каждого из слов в подстроке :
1) как
2) хорошо
3) мыла
4) раму
5) мама
независимо от регистра, и обрамить все найденные совпадения в строках тегом b, то есть сделать все найденные слова жирным текстом.
Понимаю, что необходимо сделать это с помощью replace и регулярки, но как не знаю. Подскажите пожайлуста !
Ответить с цитированием
  #2 (permalink)  
Старый 30.05.2013, 19:53
Аспирант
Отправить личное сообщение для Neznayka Посмотреть профиль Найти все сообщения от Neznayka
 
Регистрация: 08.03.2013
Сообщений: 37

Пытался делать так :
var str = "Как хорошо мыла мама раму";
var arrStr = str.split(' ');
var strIn = ['Мама мыла раму', 'Раму мыла мама', 'Мыла мама раму'];
for (var i=0; i <  strIn.length; i++)
{
     var newStr = strIn[i];
     for (var i2=0; i2 <  arrStr.length; i2++)
	      newStr = newStr.replace(new RegExp(arrStr[i2],'gi'), '<b>$&</b>');
     
     alert(newStr);
}

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

Последний раз редактировалось Neznayka, 30.05.2013 в 19:58.
Ответить с цитированием
  #3 (permalink)  
Старый 30.05.2013, 22:19
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,587

function escapeRegExp(str) {
  return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}

var str = "Как хорошо мыла мама раму";
var reg = new RegExp( escapeRegExp(str).replace(/\s+/g,'|') , 'gi' );
var strIn = ['Мама мыла раму', 'Раму мыла мама', 'Мыла мама раму', 'Папа плевал на раму' ], 
	i = strIn.length;

while(i--) strIn[i] = strIn[i].replace(reg, '<b>$&</b>');

alert(strIn.join('\n'))
__________________
29375, 35
Ответить с цитированием
  #4 (permalink)  
Старый 30.05.2013, 22:46
Аспирант
Отправить личное сообщение для Neznayka Посмотреть профиль Найти все сообщения от Neznayka
 
Регистрация: 08.03.2013
Сообщений: 37

Aetae,
Спасибо большое, то, что надо, супер !
Ответить с цитированием
  #5 (permalink)  
Старый 01.06.2013, 17:18
Аспирант
Отправить личное сообщение для Neznayka Посмотреть профиль Найти все сообщения от Neznayka
 
Регистрация: 08.03.2013
Сообщений: 37

Вот еще одна появилась задача, в дополнение к предыдущей.
Как в дополнение к пред коду :
function escapeRegExp(str) {
  return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}
	 
var str = "Как хорошо мыла мама раму";
var reg = new RegExp( escapeRegExp(str).replace(/\s+/g,'|') , 'gi' );
var strIn = ['Мама мыла раму', 'Раму мыла мама', 'Мыла мама раму', 'Папа плевал на раму' ], 
i = strIn.length;
 
while(i--) strIn[i] = strIn[i].replace(reg, '<b>$&</b>');
 
alert(strIn.join('\n'))

сделать еще нахождение и замену в перевороте с eng-раскладки на rus-раскладку, т.е теперь :
var str = "Как хорошо мама vfvf hfve";
var strIn = ['Мама мыла раму', 'Раму мыла мама', 'Hfve мыла мама',  'Мыла мама раму', 'Мыла vfvf раму', 'Папа плевал на раму' ];
/*
vskf = мыла (на раскладке eng)
vfvf = мама (на раскладке eng)
hfve = раму (на раскладке eng)
vskf vfvf hfve = мыла мама раму (на раскладке eng)
*/

в итоге нужно, чтобы все eng-слова из str были перевернуты в rus-раскладку, и был произведен поиск/сопоставление eng-rus со строками в массиве strIn и так же обрамление в b найденных слов.

Помогите пожайлуста, очень надо ! Заранее благодарен...

Последний раз редактировалось Neznayka, 01.06.2013 в 17:40.
Ответить с цитированием
  #6 (permalink)  
Старый 01.06.2013, 18:03
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,587

function code(str, reverse){
	var lang = [
			'qwertyuiop[]asdfghjkl;\'zxcvbnm,.',
			'йцукенгшщзхъфывапролджэячсмитьбю'
		], 
		from = lang[+!reverse],
		to = lang[+!!reverse],
		out = '';
	for(var i = 0, l = str.length; i < l; i++){
		out += to[from.indexOf(str.charAt(i))] || str.charAt(i);
	}
	return out
}

function escapeRegExp(str) {
  return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}

function arrayUniqueString(array){
	var hash = {}, 
		i = array.length;
	while(i--){
		if(array[i] in hash) array.splice(i,1);
		else hash[array[i]] = true;
	}
	return array
}

var str = "Как хорошо мыла мама раму";

str.toLowerCase(); //в нижний регистр
str += ' ' + code(str); //добавляем к строке закодированный вариант
str = escapeRegExp(str); //экранируем спецсиволы
str = arrayUniqueString(str.split(/\s+/)).join('|'); //очищаем от дубликатов(в принципе можно обойтись без этого)
 
var reg = new RegExp( '(^|\\s)(' + str + ')(?=\\s|$)', 'gi' ); //так находит только целые слова
//var reg = new RegExp( str, 'gi' ); //так найдёт куски слов(<b>Раму</b>нас Гядутис)
var strIn = ['Мама мыла раму', 'Vfvf мыла раму', 'Раму мыла мама', 'Hfve мыла мама',  'Hfve vskf vfvf', 'Мыла мама раму', 'Папа плевал на раму'],
i = strIn.length;
  
while(i--) strIn[i] = strIn[i].replace(reg, '$1<b>$2</b>');  
//while(i--) strIn[i] = strIn[i].replace(reg, '<b>$&</b>');
  
alert(strIn.join('\n'))
__________________
29375, 35

Последний раз редактировалось Aetae, 01.06.2013 в 18:17.
Ответить с цитированием
  #7 (permalink)  
Старый 01.06.2013, 21:23
Аспирант
Отправить личное сообщение для Neznayka Посмотреть профиль Найти все сообщения от Neznayka
 
Регистрация: 08.03.2013
Сообщений: 37

Aetae,
Спасибо за ответ ! Немного не работает, а именно определяет rus-символы переведенные в eng-символы из шаблона str, в строках массива strIn, но не определяет eng-символы переведенные в rus-символы из шаблона str, в строках массива strIn.
function code(str, reverse){
var lang = [
	'qwertyuiop[]asdfghjkl;\'zxcvbnm,.',
	'йцукенгшщзхъфывапролджэячсмитьбю'
	], 
	from = lang[+!reverse],
	to = lang[+!!reverse],
	out = '';
for(var i = 0, l = str.length; i < l; i++){
	out += to[from.indexOf(str.charAt(i))] || str.charAt(i);
}
return out
}

function escapeRegExp(str) {
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}

function arrayUniqueString(array){
var hash = {}, 
	i = array.length;
while(i--){
	if(array[i] in hash) array.splice(i,1);
	else hash[array[i]] = true;
}
return array
}
var str = "Как хорошо vskf vfvf раму";
 
str.toLowerCase(); //в нижний регистр
str += ' ' + code(str); //добавляем к строке закодированный вариант
str = escapeRegExp(str); //экранируем спецсиволы
str = arrayUniqueString(str.split(/\s+/)).join('|'); //очищаем от дубликатов(в принципе можно обойтись без этого)
  
//var reg = new RegExp( '(^|\\s)(' + str + ')(?=\\s|$)', 'gi' ); //так находит только целые слова
var reg = new RegExp( str, 'gi' ); //так найдёт куски слов(<b>Раму</b>нас Гядутис)
var strIn = ['Мама мыла раму', 'Vskf Vfvf', 'Мыла vfvf раму', 'Раму vskf мама', 'Hfve мыла мама',  'Hfve vskf vfvf', 'Мыла мама раму', 'Папа плевал на раму'],
i = strIn.length;
   
//while(i--) strIn[i] = strIn[i].replace(reg, '$1<b>$2</b>');  
while(i--) strIn[i] = strIn[i].replace(reg, '<b>$&</b>');
   
alert(strIn.join('\n'));

Хотел кнопку Запустить вставить, но не знаю как это сделать, поэтому просто код. Поиск по целым словам не актуален, актуально по кускам слов. Помогите пожалуйста вот этот момент доделать, чтобы определяло и обрамляло тегом b eng-символы переведенные в rus-символы из шаблона str, в строках массива strIn.

Последний раз редактировалось Neznayka, 01.06.2013 в 21:34.
Ответить с цитированием
  #8 (permalink)  
Старый 01.06.2013, 21:38
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,587

function code(str, reverse){
    var lang = [
            'qwertyuiop[]asdfghjkl;\'zxcvbnm,.',
            'йцукенгшщзхъфывапролджэячсмитьбю'
        ],
        from = lang[+!reverse],
        to = lang[+!!reverse],
        out = '';
    for(var i = 0, l = str.length; i < l; i++){
        out += to[from.indexOf(str.charAt(i))] || str.charAt(i);
    }
    return out
}
 
function escapeRegExp(str) {
  return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}
 
function arrayUniqueString(array){
    var hash = {},
        i = array.length;
    while(i--){
        if(array[i] in hash) array.splice(i,1);
        else hash[array[i]] = true;
    }
    return array
}
 
var str = "Как хорошо vskf vfvf раму";
 
str = str.toLowerCase(); //в нижний регистр
str += ' ' + code(str) + ' ' + code(str, true); //добавляем к строке закодированный и декодированный варианты.
str = escapeRegExp(str); //экранируем спецсиволы
str = arrayUniqueString(str.split(/\s+/)).join('|'); //очищаем от дубликатов(в принципе можно обойтись без этого)
  
var reg = new RegExp( str, 'gi' ); //так найдёт куски слов(<b>Раму</b>нас Гядутис)
var strIn = ['Мама мыла раму', 'Vfvf мыла раму', 'Раму мыла мама', 'Hfve мыла мама',  'Hfve vskf vfvf', 'Мыла мама раму', 'Папа плевал на раму'],
i = strIn.length;
   
while(i--) strIn[i] = strIn[i].replace(reg, '<b>$&</b>');
   
alert(strIn.join('\n'))


Для запускания надо добавлять параметр run: [JS/HTML run].
__________________
29375, 35

Последний раз редактировалось Aetae, 01.06.2013 в 21:42.
Ответить с цитированием
  #9 (permalink)  
Старый 01.06.2013, 23:44
Аспирант
Отправить личное сообщение для Neznayka Посмотреть профиль Найти все сообщения от Neznayka
 
Регистрация: 08.03.2013
Сообщений: 37

Aetae, спасибо Вам большое, все работает, помогли очень мне !
alert("Спасибо Вам большое Aetae, вы настоящий проф  !");

Последний раз редактировалось Neznayka, 01.06.2013 в 23:47.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсчета кол-ва вхождений каждого символа в строке. Jeremen Общие вопросы Javascript 9 10.06.2014 01:34
Замена в строке - значение элемента массива на значение элемента др. массива LiveWizard Общие вопросы Javascript 5 15.04.2012 04:09
Регулярное, замена в строке mico Общие вопросы Javascript 1 13.09.2011 22:13
Как определить какого типа данные в строке den9000 Общие вопросы Javascript 7 07.12.2010 10:57
текст в статусной строке HelpeR Общие вопросы Javascript 8 09.02.2009 13:28