所以我有一段看起来像这样的HTML ......
<p>This is some copy. In this copy is the word hello</p>
我想使用jquery将单词hello转换为链接。
<p>This is some copy. In this copy is the word <a href="">hello</a></p>
这本身并不太难。我的问题是,如果这个词已经像下面的例子那样已经分开了......
<p>In this copy is the <a href="">word hello</a></p>
我不希望最终在链接中找到链接...
<p>In this copy is the <a href="">word <a href="">hello</a></a></p>
非常感谢任何帮助。
答案 0 :(得分:3)
一个小正则表达式应该可以解决问题(更新,见下文):
$(document).ready(function(){
var needle = 'hello';
$('p').each(function(){
var me = $(this),
txt = me.html(),
found = me.find(needle).length;
if (found != -1) {
txt = txt.replace(/(hello)(?!.*?<\/a>)/gi, '<a href="">$1</a>');
me.html(txt);
}
});
});
小提琴:http://jsfiddle.net/G8rKw/
编辑:此版本效果更佳:
$(document).ready(function() {
var needle = 'hello';
$('p').each(function() {
var me = $(this),
txt = me.html(),
found = me.find(needle).length;
if (found != -1) {
txt = txt.replace(/(hello)(?![^(<a.*?>).]*?<\/a>)/gi, '<a href="">$1</a>');
me.html(txt);
}
});
});
小提琴:http://jsfiddle.net/G8rKw/3/
再次编辑:这次,“你好”作为变量传递给正则表达式
$(document).ready(function() {
var needle = 'hello';
$('p').each(function() {
var me = $(this),
txt = me.html(),
found = me.find(needle).length,
regex = new RegExp('(' + needle + ')(?![^(<a.*?>).]*?<\/a>)','gi');
if (found != -1) {
txt = txt.replace(regex, '<a href="">$1</a>');
me.html(txt);
}
});
});
答案 1 :(得分:1)
你可以这样做,
<强> Live Demo 强>
$('p').each(function(){
if($(this).find('a').length > 0) return;
lastSpaceIndex = $(this).text().lastIndexOf(' ');
if(lastSpaceIndex == -1)
lastSpaceIndex = 0;
WordToReplace = $(this).text().substring(lastSpaceIndex);
idx = $(this).text().lastIndexOf(WordToReplace);
resultstring = $(this).text().substring(0, idx);
$(this).html(resultstring);
$(this).append($( "<a href='#'>" + WordToReplace + "</a>"));
});
答案 2 :(得分:1)
此jQuery解决方案搜索特定术语,如果发现它后面跟着一个结束链接标记,则不会创建链接。
var searchTerm = "hello";
$('p:contains("' + searchTerm + '")').each(function(){
var searchString = $(this).html();
var searchIndex = searchString.indexOf(searchTerm);
var startString = searchString.substr(0 , searchIndex);
var endString = searchString.substr(searchIndex + searchTerm.length);
if(endString.match(/<\/a>/g)) return;
$(this).html(startString + "<a href=''>" + searchTerm + "</a>" + endString);
});
这是a link的jsfiddle。
答案 3 :(得分:1)
写了一个简单的函数来检查替换文本是否被链接标记括起来。见下文,
DEMO: http://jsfiddle.net/wyUYb/4/
function changeToLink (sel, txt) {
var regEx = new RegExp(txt, 'g');
$.each($(sel), function (i, el) {
var linkHTML = $(el).html();
var idx = linkHTML.indexOf(txt);
if (idx >= 0) {
var t = linkHTML.substring(idx);
//Fix for IE returning tag names in upper case http://stackoverflow.com/questions/2873326/convert-html-tag-to-lowercase
t = t.replace(/<\/?[A-Z]+.*?>/g, function (m) { return m.toLowerCase(); })
var closingA = t.indexOf('</a>');
t = t.substring(0, closingA);
if (closingA != -1) {
t = t.substring(0, closingA);
if (t.indexOf('<a') < txt.length) {
return;
}
}
linkHTML = linkHTML.replace(regEx, '<a href="">' + txt + '</a>');
$(el).html(linkHTML);
}
});
}
即使您添加嵌套链接,您的浏览器也只需将其更改为两个链接即可。可能是因为使用嵌套链接是不合法的。见下文,
还在W3C中记录了Nested Links
12.2.2嵌套链接是非法的
A元素定义的链接和锚点不能嵌套;一个A. element不得包含任何其他A元素。
由于DTD将LINK元素定义为空,因此LINK元素可以 也不要嵌套。
这就是为什么浏览器将嵌套链接作为单独的链接处理。
请参见图片右下角的萤火虫检查。
答案 4 :(得分:0)
在将其转换为链接之前,您是否可以测试该单词的父元素?
if (parent != 'a') {
// do your thing
}
(我不知道实际的jQuery会对此进行测试)
修改强>
以下内容将替换所有不包含链接的<p>
元素中的单词。
可能无法完全按照要求运作,但希望指出您的方向
// get all p elements that contain the word hello but DO NOT have link in them
var elems = $('p:contains("hello")').not(':has(a)');
// replace instances of hello in the selected p elements
$(elems).html($(elems).html().replace(/(hello)/g,'<a href="new">$1</a>'));
答案 5 :(得分:0)
尝试使用.replace jquery函数,如下所示:
var str = $('p').html().replace('(some)','(to some)');
答案 6 :(得分:0)
您需要jquery:not selector或.not()。
API文档很好地介绍了这一点,您应该可以选择内容,然后取消选择其中的链接。
答案 7 :(得分:0)
不是搜索单词并尝试查找其父级,而是搜索链接并检查其中包含的单词:
if($('a').text() === "hello"){
//already linked
}else{
//not linked
}
答案 8 :(得分:0)
首先保留单词,同时删除当前锚标记,如果有的话:
$('a').each(function() {
$(this).replaceWith(this.childNodes);
});
然后对需要使用的字符串执行替换
$('p').html($('p').text().replace('hello', '<a href="">hello</a>'));