Javascript 如何搜索HTML的每个部分
我试图忽略HTML部分中的任何链接,并获取任何没有链接的内容来完成我的功能 到目前为止,我得到的是:Javascript 如何搜索HTML的每个部分,javascript,jquery,html,Javascript,Jquery,Html,我试图忽略HTML部分中的任何链接,并获取任何没有链接的内容来完成我的功能 到目前为止,我得到的是: $(document).ready(function() { // search through paragraphs $("p").each(function() { // if there is not a link if (!$(this).find('a').hasClass('external-link')) {
$(document).ready(function() {
// search through paragraphs
$("p").each(function() {
// if there is not a link
if (!$(this).find('a').hasClass('external-link')) {
// do my function
}
})
})
我的问题是,如果一行中有一个链接,但是我想在同一行中捕获的东西,它就不起作用,因为它忽略了整行
这里是一个链接到一个工作,希望能让你看到我正在努力做什么
先谢谢你
编辑: 我可能对这个问题的措辞有点困惑 我正在努力实现的一个例子是:
<p>Link to ignore: <a href="http://www.bbc.co.uk" class="external-link" rel="nofollow">news</a>
Link to create: news </p>
要忽略的链接:
创建链接:新闻
我的代码将在
标签中搜索“新闻”,然后创建指向该网站的链接。但是,我不想在现有链接之上创建链接。我当前的代码将忽略标记中的所有内容,因为那里已经有一个链接。我采用了不同的方法并扩展了jQuery的函数原型-
$.fn.extend({
replace: function (options) {
var defaults = {
search: ''
};
options = $.extend(defaults, options);
return this.each(function () {
var string = $(this).html();
//var regex = /(search)/g;
var regex = /(^|\s)news/;
//var regex = new RegExp("(^|\s)" + options.search);
console.log(regex);
var replace_text = string.replace(regex, '<a href = "https://www.bbc.co.uk/$1">$&</a>');
$(this).html(replace_text);
});
}
});
$('p').replace({search: 'news'});
稍微更改regex以在“news”开头占一个空格(而不是大于括号),就可以对扩展函数进行一次整洁的调用。还进行了更新,以使函数更有用,允许用户向函数传递参数。仍然不完美-正在进行中。这里有一种方法可以忽略锚定,这样就不会在现有锚定中创建新锚定。
这只针对textNodes
$(document).ready(function () {
$("p").contents().each(function(_, node) {
if ( node.nodeType && node.nodeType === 3 ) {
var regex = /(news)/g;
var value = node.nodeValue.replace(regex, '<a href="https://www.bbc.co.uk/$1">$$&</a>');
if (value.match(regex)) {
var wrap = document.createElement('span');
wrap.innerHTML = value
node.parentNode.insertBefore(wrap, node);
node.parentNode.removeChild(node);
}
}
});
});
$(文档).ready(函数(){
$(“p”).contents().each(函数(\ux,节点){
if(node.nodeType&&node.nodeType==3){
var regex=/(新闻)/g;
var值=node.nodeValue.replace(regex,”);
if(value.match(正则表达式)){
var wrap=document.createElement('span');
wrap.innerHTML=value
node.parentNode.insertBefore(换行,节点);
node.parentNode.removeChild(节点);
}
}
});
});
要保留dollarsign,您必须执行$$
,因为dollarsign在正则表达式中具有特殊意义。您可以通过查看每个p
的子节点并抓取没有类外部链接的子节点来执行此操作:
var otherText = [];
$("p").each(function(){
console.log(this.childNodes);
var kids = this.childNodes;
for(var i = 0; i < kids.length; i++)
{
if(!($(kids[i]).hasClass("external-link")))
{
otherText.push(kids[i]); //or do what you want with the node here
}
}
});
console.log("other Text", otherText);
var otherText=[];
$(“p”)。每个(函数(){
console.log(this.childNodes);
var kids=this.childNodes;
for(var i=0;i
“行”不作为文档结构的一部分存在,因此作为HTML DOM上的操作,“行”可能是一个错误的词。我不知道该如何描述它。HTML标记之间的链接可能更好您想忽略包含class.external链接和p标记内部的链接吗?文档是树形结构,在浏览器中的存在方式与在编辑器中看到的不同。文档中的元素有子元素,有时也有同级元素,这个概念可能有助于澄清您到底在尝试什么。是的,两个链接没有类,但它们都不包含新闻,因此它们与正则表达式不匹配?除非它不起作用!%)P最后一条“新闻”应该是“$&”。开导我。哦,你现在想保留实际的美元符号吗?你知道dollarsign是正则表达式中的一个变量吗?哇,我不知道。一切都很好。Chrome有时不显示锚定href
悬停预览…太懒了。你做到了!恭喜。(我想你应该给他你的想法,让他停止询问anywaayyy时的困惑)。我对regex@adeneo做了一个小改动,效果更好,但仍然不完美。搜索文本的链接出错,因为它没有以“/news”结尾。我必须离开一会儿,但我会尽快重新访问。我注意到,这似乎适用于给定的示例,但如果您将锚更改为新闻
,它仍然失败,但这可能不太相关,而且OP似乎已经离开了大楼@JayBlanchard感谢您的投入!有没有可能不改变正则表达式?例如,如果我有(新闻)或在“n”前面的任何东西,它将不起作用,我将尝试将值传递给函数,但没有时间返回到函数并进行重构。任何好的函数都允许传递参数,而不是硬编码项。考虑到我会同意@adeno的答案。我会尽早尝试重构它。
var otherText = [];
$("p").each(function(){
console.log(this.childNodes);
var kids = this.childNodes;
for(var i = 0; i < kids.length; i++)
{
if(!($(kids[i]).hasClass("external-link")))
{
otherText.push(kids[i]); //or do what you want with the node here
}
}
});
console.log("other Text", otherText);