30.05.2013, 19:41
|
Аспирант
|
|
Регистрация: 08.03.2013
Сообщений: 37
|
|
Замена подстрок в строке
Добрый день.
Есть несколько строк :
1) Мама мыла раму
2) Раму мыла мама
3) Мыла мама раму
и есть подстрока :
1) Как хорошо мыла раму мама
Необходимо :
Найти в строках вхождение каждого из слов в подстроке :
1) как
2) хорошо
3) мыла
4) раму
5) мама
независимо от регистра, и обрамить все найденные совпадения в строках тегом b, то есть сделать все найденные слова жирным текстом.
Понимаю, что необходимо сделать это с помощью replace и регулярки, но как не знаю. Подскажите пожайлуста !
|
|
30.05.2013, 19:53
|
Аспирант
|
|
Регистрация: 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.
|
|
30.05.2013, 22:19
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,585
|
|
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
|
|
30.05.2013, 22:46
|
Аспирант
|
|
Регистрация: 08.03.2013
Сообщений: 37
|
|
Aetae,
Спасибо большое, то, что надо, супер !
|
|
01.06.2013, 17:18
|
Аспирант
|
|
Регистрация: 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.
|
|
01.06.2013, 18:03
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,585
|
|
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.
|
|
01.06.2013, 21:23
|
Аспирант
|
|
Регистрация: 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.
|
|
01.06.2013, 21:38
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,585
|
|
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.
|
|
01.06.2013, 23:44
|
Аспирант
|
|
Регистрация: 08.03.2013
Сообщений: 37
|
|
Aetae, спасибо Вам большое, все работает, помогли очень мне !
alert("Спасибо Вам большое Aetae, вы настоящий проф !");
Последний раз редактировалось Neznayka, 01.06.2013 в 23:47.
|
|
|
|