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

grusha 06.04.2009 21:32

Поиск выражения в тексте
 
Есть текст в котором могут присутсвовать ссылки на YouTube , в таком формате http://www.youtube.com/watch?v=iuOcLoqo5e0 вот пример текста

Код:

Google points to voice search as vital to the company's endeavours in building a presence on the mobile web.
http://www.youtube.com/watch?v=iuOcLoqo5e0

Вопрос в том как мне "отловить" эти ссылки. Ссылок может быть сколько угодно.
Думал отследить эти ссылки таким способом

jQuery('a[href~=youtube.com/watch?v=]')

Но проблема в том что атрибуда <a> нету у меня , есть просто текст.

Заранее благодарен.

Gvozd 06.04.2009 23:17

самый простой по логике способ:
получаем сисок всех нод с помощью getElementsByTagName('*')
перебираем их в цикле, а внутри цикла перебираем всех их потомков, являющихкся текстовыми нодами
каждый из них проверяемя на вхождение подстроки, и делаем с ним необходимое действие
меньше десятка строк, и никакого jQuery
на нем, же я не знаю как это реализовать, и есть ли для этого эффективные инструменты
я вроде бы слышал, что jQuery позволяет искать элементы использую XPath-синтаксис.

Riim 07.04.2009 03:55

<!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>
	<title>blank</title>
	<script type="text/javascript" src="scripts/base.debug.js"></script>
	<script type="text/javascript">
window.onload = function() {
	var arr = document.body.innerHTML.match(/http\:\/\/www\.youtube\.com\/watch\?v\=[0-9a-z]{11}/gi);
	alert(
		arr.join('\n')
	);
};
	</script>
</head>
<body>
Google points to voice search as vital to the company's endeavours in building a presence on the mobile web.
http://www.youtube.com/watch?v=iuOcLFFo5e1
fgfdgfd
fghgfh
fdgfdgfd dfsd http://www.youtube.com/watch?v=iuOcLoqo5e0 dsfs
dsfds
</body>
</html>

Gvozd 07.04.2009 10:54

Riim,
вы сами пытались запустить этот пример на странице большей, чем ваш тестовый пример? или вы считаете по несколько раз перерисовывать окно это хорошо?

Riim 07.04.2009 11:05

Если нужно их только найти то это вероятно лучший способ. Я просто забыл, что их еще и в тег "a" запихнуть надо. Невнимательно вопрос читал.

Riim 07.04.2009 11:24

Только вот у текстовых узлов innerHTML-а нету. И как поменять часть такого узла? Вероятно, придется брать его родителя и заменять часть через innerHTML. А этот родитель может тоже много чего содержать, и все это будет перерисовываться. Думаю, если другого способа нет, то лучше это на сервере делать. И ссылки будут рабочие до onload.

Gvozd 07.04.2009 15:31

Riim,
во первых, если даже считать, что мы ничего не можем сделать с текстовым узлом, а только с его родителем, это в разы лучше, чем перерисовывать ВЕСЬ документ.
вы-вторых, у текстовых нодов есть замечательное свойство nodeValue, которое доступно для редактирования.
помимо это есть куча замечательных методов типа inserBefore и прочих.
с их помощью много чего можно намутить, и при этом перерисовыватся будет минимум страницы
то есть только для проверки самого факта наличия ваш код подходит, и он быстрее.
для любой модификации в указанном месте, он уже не подходит

Riim 07.04.2009 15:42

>>> во первых, если даже считать, что мы ничего не можем сделать с текстовым узлом, а только с его родителем, это в разы лучше, чем перерисовывать ВЕСЬ документ.

Да я ж не спорю.

>>> для любой модификации в указанном месте, он уже не подходит

Если указанное место это див с текстом и без элементов.
Замечательно подойдет

Gvozd 07.04.2009 17:24

Цитата:

Сообщение от Riim
Если указанное место это див с текстом и без элементов.
Замечательно подойдет

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

Riim 07.04.2009 17:28

Про весь документ я и не спорю, а про указанное место ты сам начал.


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