Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Замена подстрок в строке (https://javascript.ru/forum/css-html/38401-zamena-podstrok-v-stroke.html)

Neznayka 30.05.2013 19:41

Замена подстрок в строке
 
Добрый день.
Есть несколько строк :
1) Мама мыла раму
2) Раму мыла мама
3) Мыла мама раму
и есть подстрока :
1) Как хорошо мыла раму мама
Необходимо :
Найти в строках вхождение каждого из слов в подстроке :
1) как
2) хорошо
3) мыла
4) раму
5) мама
независимо от регистра, и обрамить все найденные совпадения в строках тегом b, то есть сделать все найденные слова жирным текстом.
Понимаю, что необходимо сделать это с помощью replace и регулярки, но как не знаю. Подскажите пожайлуста !

Neznayka 30.05.2013 19:53

Пытался делать так :
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);
}

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

Aetae 30.05.2013 22:19

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'))

Neznayka 30.05.2013 22:46

Aetae,
Спасибо большое, то, что надо, супер !

Neznayka 01.06.2013 17:18

Вот еще одна появилась задача, в дополнение к предыдущей.
Как в дополнение к пред коду :
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 найденных слов.

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

Aetae 01.06.2013 18:03

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'))

Neznayka 01.06.2013 21:23

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.

Aetae 01.06.2013 21:38

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].

Neznayka 01.06.2013 23:44

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


Часовой пояс GMT +3, время: 23:10.