Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Генерация текста с помощью разделителей (https://javascript.ru/forum/events/28432-generaciya-teksta-s-pomoshhyu-razdelitelejj.html)

a1exei 19.05.2012 13:32

Генерация текста с помощью разделителей
 
Народ, нужна помощь по скрипту срочно!

Есть 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;
	}
...

razerxxx 20.05.2012 03:02

сначала делить строки split("\r\n");
потом полученный массив прогонят в цикле и делить строки split("||");

Aetae 20.05.2012 11:13

Внезапно: вам нужна рекурсия.)

a1exei 20.05.2012 14:23

Ну это понятно. А что дальше делать с этими кусками?) Рекурсия используется, но работает не правильно. Хотя... нет не используется. Точно). Понял. Спасибо.)

a1exei 21.05.2012 16:25

И так не получается. Вылетает ошибка 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;
	}

a1exei 21.05.2012 18:29

А если использовать рекурсию в функции find получаю "Сценарий не отвечает"!

a1exei 21.05.2012 23:57

Всё. Уже сделал, хоть и по-деревенски))). В общем работает.


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