Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Разбор строки (https://javascript.ru/forum/dom-window/6245-razbor-stroki.html)

motoroller 19.11.2009 21:36

Разбор строки
 
Добрый вечер, есть такой вопросик, хочу сделать теги для картинок,
видел на яндексе клёво сделано, вводишь в строку слова ( по видимому сепаратор запятая ии точка с запятой) и он разбирает строку, если надо удаляет дубликаты и выводит в другуб строку, подскажите как реализовать ?

Заранее спасибо

Gozar 20.11.2009 09:55

function Razbor(txt){
var arr = txt.split(",")
... дальше убираем дубликаты: (запрос в гугл:javascript array дубликаты)
var newtxt = removeDuplicateElement(arr)
document.getElementById('drugaya_stroka').value = newtxt
}

motoroller 20.11.2009 10:38

А если в тексте встречаются одновременно два сепаратора ?

Gozar 20.11.2009 12:20

http://javascript.ru/String/match
с параметрами ig, что-то типа: /(.*)[,;](.*)/ig
если параметров всего два ,; можно сначала split(",") а потом по полученному массиву for split(";"), это если с регулярками плохо, но лично мне регулярка лаконичнее

Kolyaj 20.11.2009 12:22

txt.split(/,|;/)

motoroller 20.11.2009 12:33

просто respect !!!
Спасибо подошло :)

Riim 20.11.2009 14:37

Не на js, но суть видна, а именно: все кроме \\-\\wа-я становится разделителями.

foreach (string word in Regex.Replace(searchText, "[^\\-\\wа-я]+", " ", RegexOptions.Compiled | RegexOptions.IgnoreCase).Trim().Replace("_", "[_]").Split(' '))
{

}

Gozar 20.11.2009 14:54

str.match(/([^,;])+/ig)

Но у Kolyaj,
лаконичнее :)

motoroller 20.11.2009 15:26

Вот данный ворпос решён, но тут возник по ходу ещё один,
я слова отфильтровываю, всё с ними супер, делаю trim если со словами есть пробелы, но тут возникла ещё проблема, у меня добавляются пустые пробелы, если в них есть несколько пробелов от 2 и более, скажите как проверить, что запись не состоит из одник пробелов....

Спасибо большое

Riim 20.11.2009 15:30

motoroller, в моем варианте это как раз предусмотрено. Если, конечно, я верно понял.

motoroller 20.11.2009 15:32

Спасибо RIM, я просто сделал свой мне понятный уже... там всё работает, единственное проверку никак не могу поставить, если вместо слова куча пробелов, скажите как можно сделать такую проверку ..

Riim 20.11.2009 15:48

String.prototype.trim = function(charList) {
	return this.replace(/^\s+|\s+$/g, '');
};

var str = 'jdhf    ,,,  dshfjk,,,,sah~!@#$%^dksa d<><><>gfhgdf   sd';
var result = str.replace(/[^\-\wа-я]+/gi, ' ').trim().split(' ');
alert(result.join('\r\n'));


так?

motoroller 20.11.2009 15:52

Ваш варинат хороший, но к сожалению он мне не подходит, так как у меня ключевые слова могут состоять из пар и даже трёх слов. А у вас разбивается всё по слову.

Riim 20.11.2009 15:55

Ну так поправь регулярку ;) .

motoroller 20.11.2009 15:56

дык не селён я в них особо

Riim 20.11.2009 15:59

Цитата:

Сообщение от motoroller (Сообщение 35853)
дык не селён я в них особо

http://www.pcre.ru/

А зачем это вообще? Поиск по сайту делаешь?

motoroller 20.11.2009 16:05

Ну короче не поиск я делаю, а картинки к тегам, вообще кому надо:

сделал и всех найденных toLowerCase, и тут же стал показывать length=0
у пробелов :)

motoroller 20.11.2009 16:08

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<script src="/js/jquery.js" type="text/javascript"></script>
<script  type="text/javascript">

Array.prototype.unique = function () {
	var r = new Array();
	o:for(var i = 0, n = this.length; i < n; i++) {
		for(var x = 0, y = r.length; x < y; x++) {
			if(r[x].toLowerCase()==this[i].toLowerCase()) continue o;
		}
		if(this[i].length!=0) r[r.length] = this[i];
	}
	return r;
}

function trim (array) {
    charlist = ' \\s\\xA0';
    var re = new RegExp('^[' + charlist + ']+|[' + charlist + ']+$', 'g');	
	for (var i = 0; i < array.length; i++) array[i]=array[i].replace(re, "");
	return array;
}

  
$(document).ready(function() { 
	$("#button").click(function() {
		var newTags=$("#textfield").val().toLowerCase().split(/,|;/);
		if(newTags=='') return;
		newTags=trim(newTags);
		var existsTags=$("#tagsT").val().split(/,/);
		var tags= existsTags!="" ? existsTags.concat(newTags).unique().sort() : newTags.unique().sort();	
		$("#tagsT").val(tags);
		$("#tags").empty();
		$("#textfield").val("");
		for (var i = 0; i < tags.length; i++) {
			$comma= tags.length-1==i ? "" : ",";
			$("#tags").append($("<span>"+tags[i]+"<img src='/admin/i/delete.png' class='delTag' alt='Удалить тег' />"+$comma+"  </span>"))
			
		}	
		
		});
});

</script>
</head>

<body>


<div id="tags"></div>
<input type="text" name="tagsT" id="tagsT" value="" />
<p>
  <input type="text" name="textfield" id="textfield" value="" />
  <input type="submit" name="button" id="button" value="Submit" />
</p>
</body>
</html>


Если кому надо рабочий пример, может коряво написанный, но работает

Ivan 22.11.2009 01:36

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

Don_Julio 24.05.2010 18:21

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

Есть строка:
nLA = "Subj_01&&Subj_02&&Subj_03"

Пробую разобрать "сплитом":
nArr = nLA.split("&&");

Ничего не выходит.

При этом вот такая ф-ция еще вчера(!) работала :blink:

function line2arr (str) {
nArr = str.split ("&&");
alert(nArr.length);
} // END line2arr

Kolyaj 24.05.2010 18:25

alert('Subj_01&&Subj_02&&Subj_03'.split('&&').join('\n'))

Don_Julio 25.05.2010 02:13

Дело в том, что я использую split "внутри" скрипта Greasmonkey, а там с одиночными кавычками проблема.

Я не могу понять, почему двойные кавычки перестали работать...

Kolyaj 25.05.2010 09:20

alert("Subj_01&&Subj_02&&Subj_03".split("&&").join("\n"))


И нет там никаких проблем с одиночными кавычками.

Don_Julio 25.05.2010 11:15

Я разобрался.

Та функция, которая "вчера работала" - предназначена для обработки строк, получаемых из двух разных источников: из <textarea> и из DOM Storage.
Так вот, "вчера" при обработке строки из <textarea> - все было ok, а когда я получал ту же строку из DOM Storage - ничего не происходило.
Я решил попробовать передавать строки в функцию не непосредственно из DOM Storage, а через скрытое поле <input> - всё заработало.
Что там происходило со строкой в DOM Storage я так и не знаю :no:

Kolyaj 25.05.2010 11:19

Цитата:

Сообщение от Don_Julio
Что там происходило со строкой в DOM Storage я так и не знаю

Так выведи и посмотри.

Don_Julio 25.05.2010 11:48

Я выводил и в alert, и в <input type=text> - внешне никаких отличий.
Даже копировал строку из alert и "скармливал" ф-ции - она не "давилась".
Это и сбивало с толку.

Kolyaj 25.05.2010 11:55

Значит там не строка была. Надо пропустить через String() то, что приходит.

Don_Julio 25.05.2010 13:14

Спасибо, помогло!


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