Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Поиск выражения в тексте (https://javascript.ru/forum/jquery/3317-poisk-vyrazheniya-v-tekste.html)

x-yuri 10.04.2009 16:28

Цитата:

Парни , спасибо за такое живое обсуждение моего вопроса. Прочитал всё , многое не понял
:lol: (это я не с тебя, а так, с ситуации)

Цитата:

Так всё-таки можно привести хотя бы 2 варианта кода
ну там вообще много было вариантов, только вопросы к тебе есть:
1) нужно не только найти ссылки, но и превратить их собственно в ссылки?
2) там где ты будешь ссылки искать - это просто блок текста или текст с разметкой, тэгами?
3) могут встречаться другие ссылки? Или только нужные?

Цитата:

Так же видел в коде windows.onload , моих знаний не так много и наверно я чето не понимаю , но с этим бывают проблемы
могут быть, если у тебя несколько скриптов будут изменять window.onload - только последний будет работать

Цитата:

P.S. Так же хотел спросить насколько просто/сложно , будет изменить код ,если потребуется искать не только по YouTube , но и по Google video и по другим видео....
можно, надо будет регулярное выражение доработать

Riim 10.04.2009 16:44

Цитата:

Сообщение от grusha
Меня меньше интересует размер файла , больше интересует его производительность .

Ну тогда так вот:
var TextNode = {
	each: function(callback, parent) {
		for (var childNodes = (parent || document.body).childNodes, i = 0; i < childNodes.length; i++) {
			var I = childNodes[i];
			I.nodeType == 1
				? arguments.callee(callback, I)
				: I.nodeType == 3 && callback(I, i);
		}
	}
};

window.onload = function() {
	var callback = function(noda) {
		if (noda.nodeValue.indexOf('youtube.com') > -1) {
			var v = noda.nodeValue.replace(arguments.callee.regExp, '<a href="$1">$1</a>');
			if (v != noda.nodeValue) {
				var div = arguments.callee.div;
				div.innerHTML = v;
				if (div.firstChild) {
					var f = arguments.callee.fragment;
					do f.appendChild(div.firstChild);
					while (div.firstChild);
					noda.parentNode.replaceChild(f, noda);
				}
			}
		}
	};
	callback.regExp = /(http\:\/\/www\.youtube\.com\/watch\?v\=[0-9a-z]{11})/gi;
	callback.div = document.createElement('div');
	callback.fragment = document.createDocumentFragment();
	
	TextNode.each(callback);
};


Уйти от do-while без появления лишних операций не получается у меня.



Цитата:

Сообщение от grusha
И если возможно ,то код который бы работал с библиотекой jQuery .

Зачем тут Jquery?
Разве, что вместо window.onload использовать $.ready .

Цитата:

Сообщение от grusha
Так же видел в коде windows.onload , моих знаний не так много и наверно я чето не понимаю , но с этим бывают проблемы.

Как и сказал x-yuri проблемы будут когда ты захочешь повесить на windows.onload несколько обработчиков.
$.ready в Jquery для того и сделан.

Riim 10.04.2009 16:46

И TextNode.each для любителей if-else:

var TextNode = {
	each: function(callback, parent) {
		for (var childNodes = (parent || document.body).childNodes, i = 0; i < childNodes.length; i++) {
			var I = childNodes[i];
			if (I.nodeType == 1) arguments.callee(callback, I);
			else if (I.nodeType == 3) callback(I, i);
		}
	}
};

x-yuri 10.04.2009 17:07

Цитата:

Уйти от do-while без появления лишних операций не получается у меня
так ведь если v != noda.nodeValue, то div.firstChild == true автоматически, т.е. ты это условие можешь просто убрать и заменить do-while -> while
Цитата:

И TextNode.each для любителей if-else
я бы все равно не так написал ;)

Riim 10.04.2009 17:27

Цитата:

Сообщение от x-yuri
так ведь если v != noda.nodeValue, то div.firstChild == true автоматически, т.е. ты это условие можешь просто убрать и заменить do-while -> while

А "var f = arguments.callee.fragment;" внутри while писать? Нет. А значит в некоторых случаях эта (и не только) строка сработает зря.

Цитата:

Сообщение от x-yuri
я бы все равно не так написал

grusha попросил несколько вариантов. Предлагай свой.

x-yuri 10.04.2009 18:02

Цитата:

А "var f = arguments.callee.fragment;" внутри while писать? Нет. А значит в некоторых случаях эта (и не только) строка сработает зря.
я имел в виду так:
var callback = function(noda) {
        if (noda.nodeValue.indexOf('youtube.com') > -1) {
            var v = noda.nodeValue.replace(arguments.callee.regExp, '<a href="$1">$1</a>');
            if (v != noda.nodeValue) {
                var div = arguments.callee.div;
                div.innerHTML = v;
                var f = arguments.callee.fragment;
                while (div.firstChild)
                    f.appendChild(div.firstChild);
                noda.parentNode.replaceChild(f, noda);
            }
        }
    };

если я не вижу ситуаций, когда (v != noda.nodeValue) && (! div.firstChild), скажи

Riim 10.04.2009 18:12

Цитата:

Сообщение от x-yuri
если я не вижу ситуаций, когда (v != noda.nodeValue) && (! div.firstChild), скажи

Когда в innerHTML записываются табы форматирования. Ты же сам указывал на эту ситуацию. Пост №24.

x-yuri 10.04.2009 18:16

Цитата:

Когда в innerHTML записываются табы форматирования. Ты же сам указывал на эту ситуацию. Пост №24
так ведь v != noda.nodeValue, т.е. в текстовом узле была ссылка, значит во-первых текстовый узел не пустой, а во-вторых там вообще ссылка (тэг) уже есть (после replace)
а та проблема возникла из-за пустых (почти) текстовых узлов

Riim 10.04.2009 18:23

Цитата:

Сообщение от x-yuri
так у ведь v != noda.nodeValue, т.е. в текстовом узле была ссылка

И правда. Башка ночью совсем не варит.

Значит TextNode.each из постов 82 и 83, и callback из поста 86 считаем окончательными вариантами?

Riim 10.04.2009 18:52

Только
var div = arguments.callee.div;
div.innerHTML = v;
var f = arguments.callee.fragment;


заменить на:

var div = arguments.callee.div,
	f = arguments.callee.fragment;
div.innerHTML = v;

grusha 10.04.2009 21:09

Цитата:

Сообщение от x-yuri (Сообщение 16382)


ну там вообще много было вариантов, только вопросы к тебе есть:
1) нужно не только найти ссылки, но и превратить их собственно в ссылки?
2) там где ты будешь ссылки искать - это просто блок текста или текст с разметкой, тэгами?
3) могут встречаться другие ссылки? Или только нужные?

Текст у меня распологается так :
<div class="storycontent"> текст текст текст http://www.youtube.com/watch?v=iuOcLoqo5e0 текст текст текст 
</div>

А мне надо что бы получалось так :
<div class="storycontent"> текст текст текст <a href="http://www.youtube.com/watch?v=iuOcLoqo5e0">смотреть видео</a> текст текст текст 
</div>

Надо было мне это раньше наверно написать !? :) , хотя многим я думаю эта тема поможет :)
Но в тексте конечно могут поподаться и другие варианты , как то http://www.blablabla.com,http://www.yoursite.com, но их обрабатывать не надо.Проше говоря ,мне надо чтобы я мог в код javascript добавлять ссылки которые надо найти, может быть Youtube , Google video и т.д. , т.е. может быть чтото типо массива

video_array = "http://www.youtube.com,http://youtube.com,http://youtube.ru,http://www.googlevideo.com";


Но это конечно в идеале.
Цитата:

Зачем тут Jquery?
Разве, что вместо window.onload использовать $.ready .
Да именно поэтому.
Надеюсь понятно написал ..... потому что бывает что бы задать вопрос , надо знать на него ответ :)

x-yuri 10.04.2009 21:11

2) там где ты будешь ссылки искать - это просто блок текста или текст с разметкой, тэгами?

grusha 10.04.2009 21:27

Цитата:

Сообщение от x-yuri (Сообщение 16417)
2) там где ты будешь ссылки искать - это просто блок текста или текст с разметкой, тэгами?

Просто блок текста и в тексте тегов никаких не будет.

P.S. Хотя вот тут подумал ..... может и мне будет удобнее и для написания кода ,если я буду использовать такие теги [video]http://www.youtube.com/watch?v=iuOcLoqo5e0[/video] или даже так [youtube]http://www.youtube.com/watch?v=iuOcLoqo5e0[/youtube] , [googlevideo]http://www.googlevideo.com/watch?v=iuOcLoqo5e0[/googlevideo], хотя незнаю упростит это дело или усложнит !???

x-yuri 10.04.2009 21:59

как-то так:
$(function() {
	var newContent = $('#div_id').text().replace( /http\:\/\/(www\.)?(googlevideo|youtube)\.com\S*/, '<a href="$&">$&</a>' );
	$('#div_id').html( newContent );
})

grusha 11.04.2009 01:12

Цитата:

Сообщение от x-yuri (Сообщение 16422)
как-то так:
$(function() {
	var newContent = $('#div_id').text().replace( /http\:\/\/(www\.)?(googlevideo|youtube)\.com\S*/, '<a href="$&">$&</a>' );
	$('#div_id').html( newContent );
})

Спасибо большое,в принципе работает ..... но у меня много этих #div_id , и получается что он в каждый добавляет тексты из всех остальных .....хотя ссылки действительно поменял :)

P.S. Уже второй раз пытаюсь добавить плюсик x-yuri , но мне пишет , что сначала я должен добавить плюсик кому то еще :)

x-yuri 11.04.2009 08:43

Цитата:

Спасибо большое,в принципе работает ..... но у меня много этих #div_id , и получается что он в каждый добавляет тексты из всех остальных .....хотя ссылки действительно поменял
а как ты это дело на несколько div'ов распространил?

grusha 11.04.2009 13:59

Цитата:

Сообщение от x-yuri (Сообщение 16438)
а как ты это дело на несколько div'ов распространил?

У меня структура сайта такая....
<div id="story">
<div id="title">Title1</div>
<div class="storycontent">text text text text </div>
</div>

<div id="story">
<div id="title">Title2</div>
<div class="storycontent">text2 text2 text2 text2 </div>
</div>

<div id="story">
<div id="title">Title3</div>
<div class="storycontent">text3 text3 text3 text3 </div>
</div>


и т.д.

x-yuri 12.04.2009 12:59

ну ты, наверное, пишешь
$('.storycontent').text()....

а что выдает alert( $('.storycontent').text() );

grusha 16.04.2009 19:49

Цитата:

Сообщение от x-yuri (Сообщение 16468)
ну ты, наверное, пишешь
$('.storycontent').text()....

а что выдает alert( $('.storycontent').text() );

Извиняюсь,что долго не отвечал.
Выдает мне

text text text text
text2 text2 text2 text2 
text3 text3 text3 text3

Причём записывает все эти тексты в каждый div.

x-yuri 16.04.2009 19:57

значит text возвращает содержимое всех элементов с классом storycontent. А тебе нужно выполнить действия для каждого элемента отдельно, для этого есть функция each

grusha 16.04.2009 22:59

Цитата:

Сообщение от x-yuri (Сообщение 16822)
значит text возвращает содержимое всех элементов с классом storycontent. А тебе нужно выполнить действия для каждого элемента отдельно, для этого есть функция each

Спасибо огромное , буду пробовать.

grusha 17.04.2009 02:19

вобщем сделал с помощью each , вроде всё стало нормально , новости не дублируются , но появилась новая проблема , остальные ссылки в тексте ,перестали быть ссылками , а стали просто текстом :)

x-yuri 17.04.2009 02:24

1) ну покажи тогда код что ли. Или ты просто поделился впечатлениями? :)
2) этот код остальные ссылки "портит"? Т.е. если его закомментировать, то все ок?

grusha 17.04.2009 03:59

Цитата:

Сообщение от x-yuri (Сообщение 16847)
1) ну покажи тогда код что ли. Или ты просто поделился впечатлениями? :)
2) этот код остальные ссылки "портит"? Т.е. если его закомментировать, то все ок?

Код такой

jQuery('.storycontent').each(function(){
		var newContent = jQuery(this).text().replace( /http\:\/\/(www\.)?(googlevideo|youtube)\.com\S*/, '<a href="$&">$&</a>' );
    jQuery('.storycontent').html( newContent );
								  });

Да он убирает остальные ссылки и делает их просто текстом .
Я уже думаю .... может проще на ПХП сделать ..... :) :) :)

x-yuri 17.04.2009 04:12

Цитата:

2) там где ты будешь ссылки искать - это просто блок текста или текст с разметкой, тэгами?
- Просто блок текста и в тексте тегов никаких не будет.
а теперь ты говоришь, что у тебя там ссылки... ну так замени text на html, text ведь возвращает только текст, без разметки
p.s.
jQuery('.storycontent').html( newContent );

неужели работает? O_o


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