Приступил к работе
|
о. ручонки добрались :)
интересно с регами повозиться, но для меня(или всех) это адски сложно. таки сделал вот рега Цитата:
это хранится так : 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 |
| Часовой пояс GMT +3, время: 12:46. |