Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 29.10.2011, 00:40
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Приступил к работе
Ответить с цитированием
  #12 (permalink)  
Старый 29.10.2011, 01:07
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

о. ручонки добрались :)

интересно с регами повозиться, но для меня(или всех) это адски сложно.

таки сделал

вот рега

Цитата:
/(?:<(\w+)(.*?)(?:(?:src=")|>))?\s*((?:http:\/\/)?(?:www)?((?:\w+\.)+\w+)(?:\/\w+(?:\.\w+)?)*(?:\?[\w\d%=&,\.;]+)?)\s*("|<)?/gi
есть массив , в которых содержатся строки имён тегов, внутри которых заменять текст (адрес) на ссылки не надо

это хранится так :
prohibited = ['a','img'];

после первого запуска все строки преобразуются в регулярные выражения с флагом i (игнорирования регистра).

т.е. можно сделать из этого функцию и прогонять ею поступивший, к примеру, через ajax html.

полный текст скрипта :
prohibited = ['a','img'];
a=/(?:<(\w+)(.*?)(?:(?:src=")|>))?\s*((?:http:\/\/)?(?:www)?((?:\w+\.)+\w+)(?:\/\w+(?:\.\w+)?)*(?:\?[\w\d%=&,\.;]+)?)\s*("|<)?/gi;

b=function(a, tagname,attrs, url, domain, end){ 
    
    for(var i=0;i<prohibited.length;i++) {
        if(typeof prohibited[i]=="string")
            prohibited[i] = new RegExp(prohibited[i],'i');
        if(prohibited[i].test(tagname))
            return a;
    };

    url = url.replace(/&amp;/g,'&');
    
return (tagname?('<'+tagname+(attrs||'')+'>'):'')+domain.link(url)+(end||'');
};

document.body.innerHTML = document.body.innerHTML.replace(a,b);


примеры:

1.jsfiddle (работающий пример)
2.
Пример: примерочная в данный момент не работает
это было уже ссылкой<br>
<a href="http://google.ru">href to <b>www.google.ru</b></a>
<hr>
<u>ссылки текстом</u>
<br>
просто ссылка текстом на vk.ru<hr>

и на гугл карту <br>
http://maps.google.ru/maps/place?q=59.944215,30.307012

<hr>
ссылка текстом в элементе с атрибутами
<br>
<i onclick="alert('Приятного просмотра');">http://wiki.winehq.org/UsefulRegistryKeys</i>

<script>
prohibited=["a","img"];
a=/(?:<(\w+)(.*?)(?:(?:src=")|>))?\s*((?:http:\/\/)?(?:www)?((?:\w+\.)+\w+)(?:\/\w+(?:\.\w+)?)*(?:\?[\w\d%=&,\.;]+)?)\s*("|<)?/gi;b=function(f,d,g,e,h,i){for(var c=0;c<prohibited.length;c++)if(typeof prohibited[c]=="string"&&(prohibited[c]=RegExp(prohibited[c],"i")),prohibited[c].test(d))return f;e=e.replace(/&amp;/g,"&");return(d?"<"+d+(g||"")+">":"")+h.link(e)+(i||"")};document.body.innerHTML=document.body.innerHTML.replace(a,b);
</script>


UPD. хм. да. будут сниматься обработчики. ну что же, переделаем :) рега уже есть

Последний раз редактировалось melky, 29.10.2011 в 01:09. Причина: косяк.
Ответить с цитированием
  #13 (permalink)  
Старый 29.10.2011, 18:32
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

переписал с другим алгоритмом.

всё делается с помощью dom'овских функций, без оперирования с innerHTML


......
есть демки для демонстрации работы.

В этой демке - html без скрипта. есть атрибуты, текстовые ссылки и разные выпендрёжи.
http://jsfiddle.net/HCryf/

теперь та же страница, но обработанная скриптом.
http://jsfiddle.net/vXeQb/
.....

ниже сам скрипт в двух версиях - минифированный и исходник.

Исходник :
http://pastie.org/2778322
.
и минифицированная версия
http://pastie.org/2778319.

для работы скрипта достаточно поместить его перед закрывающим тегом body (</body>) или же вызвать его другим способом после загрузки dom-дерева.
Ответить с цитированием
  #14 (permalink)  
Старый 29.10.2011, 19:12
Аватар для Magneto
Люмус, Емаксос Developer!
Отправить личное сообщение для Magneto Посмотреть профиль Найти все сообщения от Magneto
 
Регистрация: 06.05.2010
Сообщений: 677

Зачем ты все это пишешь? Кажется Gvozd договорился и пишет(написал) это за деньги.
Ответить с цитированием
  #15 (permalink)  
Старый 29.10.2011, 20:28
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

ради себя плюс для добавления скрипта в свою коллекцию
Ответить с цитированием
  #16 (permalink)  
Старый 29.10.2011, 22:09
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Magneto,
+1.
в принципе малость неэтично.
Хотя, в моем случае, так как мы уже договорились с заказчиком о работе, и начали, то мне это никак не помешало.

Чуть позже, с разрешения заказчика опубликую свое решение, и проанализирую второе решение melky
Ответить с цитированием
  #17 (permalink)  
Старый 29.10.2011, 22:16
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Вот мое решение по данному проекту:
function replace_links() {
	var regexp = /(https?:\/\/\S*)|(www\.\S*)|(\S+\.(ru|net|com|kr|jp)\S*)/ig
	var replacer = function(t) {
		var _t = t;
		if(!/https?:\/\//.test(t))
			t = 'http://' + t;
		return '<a href="' + t + '" target="_blank">' + _t + '</a>';
	};
	var all_tags = document.getElementsByTagName('*');
	var replaced_elems = [];
	for(var i = 0; i < all_tags.length; i++) {
		//exit on <script> and <a> before recursive
		var tmp = all_tags[i]; var exit = false;
		while('HTML' != tmp.tagName) {
			if('A' == tmp.tagName || 'SCRIPT' == tmp.tagName || 'STYLE' == tmp.tagName) {
				exit = true;
				break;
			}
			tmp = tmp.parentNode;
		}
		if(exit) {
			continue;
		}
		//cycle for Text Nodes in current Tag
		for(var j = 0; j < all_tags[i].childNodes.length; j++) {
			if(3 == all_tags[i].childNodes[j].nodeType) {
				var str = all_tags[i].childNodes[j].nodeValue;
				regexp.lastIndex = 0;
				if(regexp.test(str)){
					str = str.replace(regexp, replacer);
					replaced_elems.push([all_tags[i].childNodes[j], str]);
				}
			}
		}
	}
	for(var i = 0; i < replaced_elems.length; i++) {
		var curr_elem = replaced_elems[i][0];
		var str = replaced_elems[i][1];
		curr_elem.nodeValue = '';
		var tmp_elem = document.createElement('div');
		tmp_elem.innerHTML = str;
		for(var j = 0, s = tmp_elem.childNodes.length; j < s; j++) {
			curr_elem.parentNode.insertBefore(tmp_elem.childNodes[0], curr_elem);
		}
	}
}
Ответить с цитированием
  #18 (permalink)  
Старый 30.10.2011, 16:59
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Вариант на основе решения Gvozd ...
<!DOCTYPE >
<html>
<head>
<title></title>
<script type="text/javascript">
var dom_replace_links = function (c) {
        (function (c) {
            for (var d = /(https?:\/\/\S*)|(www\.\S*)|(\S+\.(ru|net|com|kr|jp)\S*)/mig,
            g = function (a) {
                    var b = a;
                    /https?:\/\//.test(a) || (a = "http://" + a);
                    return '<a href="' + a + '" target="_blank">' + b + "</a>"
                }, b = c.childNodes, a = b.length - 1; a >= 0; a--)
                if (!/^a|script|style$/i.test(b[a].tagName))
                if (d.lastIndex = 0, b[a].hasChildNodes()) arguments.callee(b[a]);
                else if (b[a].nodeType == 3 && d.test(b[a].nodeValue)) {
                var e = document.createElement("div");
                e.innerHTML = b[a].nodeValue.replace(d, g);
                for (var f = document.createDocumentFragment(); e.firstChild;) f.appendChild(e.firstChild);
                b[a].parentNode.replaceChild(f, b[a])
            }
        })(c)
    };
window.onload=function(){dom_replace_links(document.body)};
</script>
</head>
<body>
<a href="http://javascript.ru/" target="_blank">http://javascript.ru/</a> <br /> тест http://javascript.ru/
<p style=" background-color: #FFFF00">javascript.ru http://javascript.ru/forum/images/ca_serenity/misc/logo.gif </p>
<img src="http://javascript.ru/forum/images/ca_serenity/misc/logo.gif" border="0" alt="" />
</body>
</html>
Ответить с цитированием
  #19 (permalink)  
Старый 05.11.2011, 04:38
Аватар для float
Профессор
Отправить личное сообщение для float Посмотреть профиль Найти все сообщения от float
 
Регистрация: 01.07.2010
Сообщений: 387

Цитата:
Вариант на основе решения Gvozd ...
чемпионат по обфускации кода не выигрывали?
Ответить с цитированием
  #20 (permalink)  
Старый 05.11.2011, 16:17
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

float,
основное в коде поиск ссылок в любом елементе html dom_replace_links(element) + перезапись текстовой ноды в которой найдены ссылки целиком = одноразово а не добавление по частям = строки 19,20
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите доработать скрипт Medvedoc Javascript под браузер 0 18.10.2011 16:09
Не работает скрипт :( VladimirV Javascript под браузер 5 21.12.2010 14:26
Скрипт составления списка ссылок и их сортировка по алфавиту Друг Работа 13 30.10.2010 16:56
А как зделать скрипт, чтобы например скрипт 1 заменялся скриптом 2? yura371 Общие вопросы Javascript 3 06.01.2009 22:40
добавление окошка в скрипт подсчета слов Гость Общие вопросы Javascript 10 11.03.2008 17:07