Javascript-форум (https://javascript.ru/forum/)
-   Работа (https://javascript.ru/forum/job/)
-   -   Скрипт ссылок (за небольшую оплату) (https://javascript.ru/forum/job/22587-skript-ssylok-za-nebolshuyu-oplatu.html)

darkcrash2007 25.10.2011 21:18

Скрипт ссылок (за небольшую оплату)
 
Нужен небольшой скрипт, возможно есть в паблике (но я не нашел).
Нужно чтобы скрипт делал все текстовые ссылки на сайте ввида (http:// и www.) - гиперссылками, но при этом не изменял уже рабочие ссылки <a href></a> и все ссылки в тегах <>.

Цена: 12$
Сроки: любые.

IcQ 631-477-57девять

melky 25.10.2011 21:35

Цитата:

Сообщение от darkcrash2007 (Сообщение 132766)
все ссылки в тегах <>.

это что ?

darkcrash2007 25.10.2011 21:46

другими словами, чтобы скрипт не читал html (не возникали проблемы приведенные снизу),

например <img src="http://southernfriedgamer.com/wp-con..._1920x1200.jpg"> ( нужно чтобы скрипт не делал эту ссылкой гиперссылкой)

melky 25.10.2011 23:05

ясное дело :)

какие сроки ?

darkcrash2007 25.10.2011 23:33

Цитата:

Сообщение от melky (Сообщение 132802)
ясное дело :)

какие сроки ?

Да не поджимает, хоть месяц. были бы сроки цена бы была выше :)

darkcrash2007 28.10.2011 22:26

Кто то взялся за скрипт?

Gvozd 28.10.2011 23:08

Цитата:

Сообщение от darkcrash2007
Кто то взялся за скрипт?

вы щаз прикололись?
Или вы считаете, что кто-то будет делать работу, не оповестив вас(заказчика)?

А вообще, с предложенной вами суммой оплаты вам возможно долго придется ждать исполнителя

melky 28.10.2011 23:52

я занимался.

там сложновато вообще-то.

я сидел 2 часа над ней, и решил , но с косяком.

вспомнив про сумму за скрипт, убил его нахрен.

180 рублей за адскую работу с регами - ну его.

darkcrash2007 29.10.2011 00:25

Новая цена: 12$

Gvozd 29.10.2011 00:30

melky,
я вижу только две регулярки, перебор всего DOM-дерева, и правку текстовых нод этими регулярками.
Я подозреваю, что ты сильно усложняешь задачу, и работаешь с body.innerHTML кучей регулярок.
Это решение неудобное и неправильное(снимает все обработчики событий)

Но, цена в любом случае не 6 баксов

Gvozd 29.10.2011 00:40

Приступил к работе

melky 29.10.2011 01:07

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

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

таки сделал

вот рега

Цитата:

/(?:<(\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 18:32

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

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


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

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

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

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

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

для работы скрипта достаточно поместить его перед закрывающим тегом body (</body>) или же вызвать его другим способом после загрузки dom-дерева.

Magneto 29.10.2011 19:12

Зачем ты все это пишешь? Кажется Gvozd договорился и пишет(написал) это за деньги.

melky 29.10.2011 20:28

ради себя плюс для добавления скрипта в свою коллекцию

Gvozd 29.10.2011 22:09

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

Чуть позже, с разрешения заказчика опубликую свое решение, и проанализирую второе решение melky

Gvozd 29.10.2011 22:16

Вот мое решение по данному проекту:
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);
		}
	}
}

рони 30.10.2011 16:59

Вариант на основе решения 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>

float 05.11.2011 04:38

Цитата:

Вариант на основе решения Gvozd ...
чемпионат по обфускации кода не выигрывали?

рони 05.11.2011 16:17

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

Gozar 06.11.2011 14:41

Цитата:

Сообщение от рони (Сообщение 134595)
float, основное в коде поиск ссылок в любом елементе html

не всех ссылок, а лишь определённого типа.

Класс метасимволов \S* страшная вещь.

А это значит что возможны при указании ссылки вида: 'ссылка:http://ya.ru', мы получим: ''http://ссылка:http://ya.ru'
'ссылкаya.ru', мы получим: 'http://xn--javascript-yqiam0aq6a3i6c9a.ru/'

ну и так далее.

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

Gozar 02.12.2011 00:50

melky,
Рега тоже кривая. Нельзя указывать ссылки вида ya.ru/pre-fix/
И между слов, ссылки у тебя стоять не могут, ты их углами отбиваешь, а это подгонка под реализацию. Этот форум тоже любит русский :)
(МЕЖДУhttp://goo.gle.ru/?q=asdfСЛОВ,)


var a = 'ссылка на карту google maps goo.gle.ru/?q=adfСЛОВ, sdfg ывап'.
match(/(http(s)?:\/\/)?(www\.)?([-.a-z0-9]+)\.(ru|com|net)([-$_.,+=:;/?@&#%a-z0-9]+)?(\/|\b)/i);
alert(a[0]);


Сегодня довелось немного подумать, пока решение такое, но будет ещё допиливаться:

var a = 'ссылка на карту google maps http://maps.google.ru/maps/pre-fix/'.
match(/(http(s)?:\/\/)?(www\.)?([-.a-z0-9]+)\.(ru|com|net)([-$_.,+=:;/?@&#%a-z0-9]+)?(\/|\b)/i);
alert(a[0]);

Почемучкин 05.12.2011 01:12

А если сайт вида
www1.mail.ru
или
subdomain.domain.com
А еще надо запятую, двоеточие и точку в конце убирать - это частая ошибка

devote 05.12.2011 01:22

Цитата:

Сообщение от Почемучкин (Сообщение 140791)
А если сайт вида
www1.mail.ru
или
subdomain.domain.com
А еще надо запятую, двоеточие и точку в конце убирать - это частая ошибка

вот решение http://javascript.ru/forum/project/2...tml#post140782


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