Генерация текста с помощью разделителей
Народ, нужна помощь по скрипту срочно!
Есть 2 текстовых поля textarea. В первое вводятся предложения построчно. Если внутри предложения встречается разделитель, то должно получится 2 новых варианта: первый со словом слева от символа разделителя, второй - со словом после. Никак не могу понять как осуществить данный алгоритм, может кто-то знает решение? Получилось сделать только с одной меткой, т.е. вышло 2 варианта из одного. Пример: Из Стоимость товаров||услуг на нашем сайте. Получил Стоимость товаров на нашем сайте Стоимость услуг на нашем сайте Если же || встречается еще и где-то в другой части предложения, получается какой-то бред. Вобще не могу понять как это сделать, какая логика тут заработает? Вот функции которые обрабатывают текст.
function generate() {
to.value="";
var txt=from.value;
var strings=txt.split(/<br>|\r?\n/);
var p="(?:\\(([^\\)]*)\\)|([^\\s]+))";
var pat=new RegExp(p+"\\|\\|"+p,"g");
var gen_str=[];
function find(str) {
var strings=str;
var replaces={};
for(var i=0;i<strings.length;i++) {
var parts=strings[i].match(pat);
if(parts!==null && parts!==undefined) {
var string=strings[i];
for(var k=0;k<parts.length;k++) {
var splited=parts[k].split('||');
if(splited!==undefined && splited!==null) {
replaces[parts[k]]=[i,k,splited];
}
}
} else gen_str.push(strings[i]);
}
return replaces;
}
...
|
сначала делить строки split("\r\n");
потом полученный массив прогонят в цикле и делить строки split("||"); |
Внезапно: вам нужна рекурсия.)
|
Ну это понятно. А что дальше делать с этими кусками?) Рекурсия используется, но работает не правильно. Хотя... нет не используется. Точно). Понял. Спасибо.)
|
И так не получается. Вылетает ошибка too much recursion.
Вот код:
function generate() {
to.value="";
var txt=from.value;
var strings=txt.split(/<br>|\r?\n/);
//var str="";
var p="(?:\\(([^\\)]*)\\)|([^\\s]+))";
var pat=new RegExp(p+"\\|\\|"+p,"g");
var gen_str=[];
function find(str) {
var strings=str;
for(var i=0;i<strings.length;i++) {
var parts=strings[i].match(pat);
if(parts!==null && parts!==undefined) {
var string=strings[i];
var replaces=[];
for(var k=0;k<parts.length;k++) {
var splited=parts[k].split('||');
if(splited!==undefined && splited!==null) {
replaces[k]=splited;
}
}
strings[i]=rep_(strings[i],replaces).join('\n');
} else gen_str.push(strings[i]);
}
return strings;
}
function rep_(str,rep) {
var str=str;
var rep=rep;
var stroki=[];
for(var z=0;z<rep.length;z++) {
var splited=rep[z];
var spl=splited.join('||');
for(var s=0;s<splited.length;s++) {
var this_rep=str.replace(spl,splited[s]);
if(this_rep!==undefined && this_rep.indexOf('||')!==-1) {
this_rep=rep_(this_rep,rep).join('\n');
}
stroki[stroki.length]=this_rep;
}
}
return stroki;
}
|
А если использовать рекурсию в функции find получаю "Сценарий не отвечает"!
|
Всё. Уже сделал, хоть и по-деревенски))). В общем работает.
|
| Часовой пояс GMT +3, время: 02:25. |