Получение частей строки, заключенных между двумя подстроками
Здравствуйте!
Столкнулся со следующей задачей. Нужна функция, получающая в массив все куски строки, находящиеся между двух заданных строк. Совсем замучился, не получается написать. Приведу пример в виде кода: function myFunc(text, start, finish) { ... } var testText = "привет меня зовут Вася. привет и меня тоже зовут Вася"; var arr = myFunc(testText, 'привет', 'Вася'); // arr должен получиться [' меня зовут ',' и меня тоже зовут '] Не могли бы вы мне подсказать, как это реализовать? |
По заданым строкам составить регулярное выражение и по нему искать.
|
Цитата:
|
Цитата:
var txt = "привет меня зовут Вася. привет и меня тоже зовут Вася"; var a=txtToArray(txt); alert(a); function txtToArray(Txt) { var a=txt.split('привет'); var b=[]; for (var i=1; i<a.length; i++) { b[b.length]=a[i].split('Вася')[0]; }; return b; }; |
Цитата:
var txt = "привет меня зовут Вася. привет, а меня зовут Федя."; var a=txtToArray(txt); alert(a); function txtToArray(Txt) { var a=txt.split('привет'); var b=[]; for (var i=1; i<a.length; i++) { b[b.length]=a[i].split('Вася')[0]; }; return b; }; |
rgl, да ты просто вскрыл нарыв! :lol:
|
Tie,
Что-бы что-то сделать, нужно более точное условие. Что делать в случае: "привет-привет меня зовут Вася. привет и меня тоже зовут Вася, да-да, тоже Вася" Считать началом первый "привет" или второй? И на каком из Васей останавливаться? |
Предложу такой, обновлённый вариант :lol:
var txt = "привет меня зовут Вася. привет, а меня зовут Федя."; var a=txtToArray(txt); alert(a); txt = "привет-привет меня зовут Вася. привет и меня тоже зовут Вася, да-да, тоже Вася"; a=txtToArray(txt); alert(a); function txtToArray(Txt) { var a=txt.split('привет'); var b=[]; var c; for (var i=1; i<a.length; i++) { c=a[i].split('Вася'); if (c.length>1) b[b.length]=c[0]; }; return b; }; |
Спасибо огромное!
Принцип понял, дальше сделаем :) Вообще, для уточнения условий - ищем первый "привет", потом первого "Васю" - вытаскиваем то что между. Потом второй "привет" и второго "Васю"... Ну и т.д. |
На ваш вкус.)
function searchBetween(str, first, second){ var fl = first.length, sl = second.length, f, s = -sl, arr =[]; while((f = str.indexOf(first, s+sl)) !== -1 && (s = str.indexOf(second,f+fl)) !== -1 ){ arr.push(str.slice(f+fl, s)) } return arr } function searchBetweenReg(str, first, second){ function escape(str) { return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); } var result = [], arr = str.split(new RegExp(escape(first) + '([\\s\\S]*?)' + escape(second),'')); for(var i=1, l = arr.length; i<l; i+=2 ) result.push(arr[i]); return result } function searchBetweenReg2(str, first, second){ function escape(str) { return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); } var reg = new RegExp( escape(first) + '([\\s\\S]*?)' + escape(second),'g'), arr = [], sub; while((sub = reg.exec(str)) !== null) arr.push(sub[1]); return arr } |
Цитата:
Цитата:
А если серьезно, позволю себе пару комментариев: 1. Внутри классов почти ничего маскировать не нужно. Правда, иногда для этого все должно быть на своих местах. Не нужно маскировать скобку [ если она в самом начале или после символа отрицания ^, не нужно маскировать ^ если ставить этот символ не в самое начало, не нужно маскировать минус, если ставить его в начале или в конце (но начало уже занято [ поэтому ставим в конце), остальные символы (кроме \ и возможно /) просто маскировать не нужно. Поэтому в итоге получаем: // return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); return str.replace(/[][\/{}()*+?.\\^$|]/g, "\\$&"); 2. Вариант searchBetweenReg полагается на то, что split добавляет в результирующий массив подгруппы (т.е. кусочки в скобочках) а это может быть так, а может и не быть, т.е. получается непереносимо. Значит остается первый и третий вариант. |
var txt = "привет меня зовут Вася. привет и меня тоже зовут Вася"; txt = txt.replace(/Вася(?:.(?!привет)*).привет/img,'=ВасПрив=') txt = txt.split(/=ВасПрив=|привет|Вася/); txt.splice(0,1); txt.splice(-1,1) alert(txt) |
Цитата:
var txt = "привет меня зовут Вася. (хи-хи) привет и меня тоже зовут Вася"; txt = txt.replace(/Вася(?:.(?!привет)*).привет/img,'=ВасПрив=') txt = txt.split(/=ВасПрив=|привет|Вася/); txt.splice(0,1); txt.splice(-1,1) alert(txt) |
var txt = "привет меня зовут Вася. (хи-хи) привет и меня тоже зовут Вася"; txt = txt.replace(/Вася(?:.(?!привет))*.привет/img,'=ВасПрив=') txt = txt.split(/=ВасПрив=|привет|Вася/); txt.splice(0,1); txt.splice(-1,1) alert(txt) |
В любом случае - непереносимо. Напоминаю:
http://javascript.ru/forum/misc/3600...tml#post238235 Я к тому, что txt.splice(0,1); txt.splice(-1,1) может быть нужно, а может и нет |
split в ie<8 лечится как и всё остальное - подключением эмуляции.
|
Часовой пояс GMT +3, время: 08:13. |