Скрипт ссылок (за небольшую оплату)
Нужен небольшой скрипт, возможно есть в паблике (но я не нашел).
Нужно чтобы скрипт делал все текстовые ссылки на сайте ввида (http:// и www.) - гиперссылками, но при этом не изменял уже рабочие ссылки <a href></a> и все ссылки в тегах <>. Цена: 12$ Сроки: любые. IcQ 631-477-57девять |
Цитата:
|
другими словами, чтобы скрипт не читал html (не возникали проблемы приведенные снизу),
например <img src="http://southernfriedgamer.com/wp-con..._1920x1200.jpg"> ( нужно чтобы скрипт не делал эту ссылкой гиперссылкой) |
ясное дело :)
какие сроки ? |
Цитата:
|
Кто то взялся за скрипт?
|
Цитата:
Или вы считаете, что кто-то будет делать работу, не оповестив вас(заказчика)? А вообще, с предложенной вами суммой оплаты вам возможно долго придется ждать исполнителя |
я занимался.
там сложновато вообще-то. я сидел 2 часа над ней, и решил , но с косяком. вспомнив про сумму за скрипт, убил его нахрен. 180 рублей за адскую работу с регами - ну его. |
Новая цена: 12$
|
melky,
я вижу только две регулярки, перебор всего DOM-дерева, и правку текстовых нод этими регулярками. Я подозреваю, что ты сильно усложняешь задачу, и работаешь с body.innerHTML кучей регулярок. Это решение неудобное и неправильное(снимает все обработчики событий) Но, цена в любом случае не 6 баксов |
Приступил к работе
|
о. ручонки добрались :)
интересно с регами повозиться, но для меня(или всех) это адски сложно. таки сделал вот рега Цитата:
это хранится так : 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(/&/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(/&/g,"&");return(d?"<"+d+(g||"")+">":"")+h.link(e)+(i||"")};document.body.innerHTML=document.body.innerHTML.replace(a,b); </script> UPD. хм. да. будут сниматься обработчики. ну что же, переделаем :) рега уже есть |
переписал с другим алгоритмом.
всё делается с помощью dom'овских функций, без оперирования с innerHTML ...... есть демки для демонстрации работы. В этой демке - html без скрипта. есть атрибуты, текстовые ссылки и разные выпендрёжи. http://jsfiddle.net/HCryf/ теперь та же страница, но обработанная скриптом. http://jsfiddle.net/vXeQb/ ..... ниже сам скрипт в двух версиях - минифированный и исходник. Исходник : http://pastie.org/2778322 . и минифицированная версия http://pastie.org/2778319. для работы скрипта достаточно поместить его перед закрывающим тегом body (</body>) или же вызвать его другим способом после загрузки dom-дерева. |
Зачем ты все это пишешь? Кажется Gvozd договорился и пишет(написал) это за деньги.
|
ради себя плюс для добавления скрипта в свою коллекцию
|
Magneto,
+1. в принципе малость неэтично. Хотя, в моем случае, так как мы уже договорились с заказчиком о работе, и начали, то мне это никак не помешало. Чуть позже, с разрешения заказчика опубликую свое решение, и проанализирую второе решение melky |
Вот мое решение по данному проекту:
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); } } } |
Вариант на основе решения 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,
основное в коде поиск ссылок в любом елементе html dom_replace_links(element) + перезапись текстовой ноды в которой найдены ссылки целиком = одноразово а не добавление по частям = строки 19,20 |
Цитата:
Класс метасимволов \S* страшная вещь. А это значит что возможны при указании ссылки вида: 'ссылка:http://ya.ru', мы получим: ''http://ссылка:http://ya.ru' 'ссылкаya.ru', мы получим: 'http://xn--javascript-yqiam0aq6a3i6c9a.ru/' ну и так далее. Ты лучше регу оптимизируй хотя бы под латинские домены, я не говорю даже о многоязычности. |
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]); |
А если сайт вида
www1.mail.ru или subdomain.domain.com А еще надо запятую, двоеточие и точку в конце убирать - это частая ошибка |
Цитата:
|
Часовой пояс GMT +3, время: 17:37. |