Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何搜索HTML的每个部分_Javascript_Jquery_Html - Fatal编程技术网

Javascript 如何搜索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')) {

我试图忽略HTML部分中的任何链接,并获取任何没有链接的内容来完成我的功能

到目前为止,我得到的是:

$(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);