Javascript 在空白处拆分句子并查找单词

Javascript 在空白处拆分句子并查找单词,javascript,html,anchor,hyperlink,Javascript,Html,Anchor,Hyperlink,好吧,这是一个我一直坚持的微笑问题。我试图制作一个HTML文本框,当提交时,文本被抛出到一个函数中,并检查是否有任何链接。如果有一个链接,它将被包装在锚定标签中,并制作成一个可点击的链接 所以我让那个部分工作,但我创建了一个编辑函数。因此,当在注释上按下编辑按钮时,将显示一个带有已创建注释的弹出窗口。注释的值(取自XML文件)放入此编辑文本区域的值中。但是链接的值仍然有锚定标记,因此看起来非常混乱 我正在尝试创建一个函数,该函数运行在这个注释上,删除所有锚定标记,并且只在锚定标记中包含剩余的文本

好吧,这是一个我一直坚持的微笑问题。我试图制作一个HTML文本框,当提交时,文本被抛出到一个函数中,并检查是否有任何链接。如果有一个链接,它将被包装在锚定标签中,并制作成一个可点击的链接

所以我让那个部分工作,但我创建了一个编辑函数。因此,当在注释上按下编辑按钮时,将显示一个带有已创建注释的弹出窗口。注释的值(取自XML文件)放入此编辑文本区域的值中。但是链接的值仍然有锚定标记,因此看起来非常混乱

我正在尝试创建一个函数,该函数运行在这个注释上,删除所有锚定标记,并且只在锚定标记中包含剩余的文本

举个简单的例子,当用户使用类似www.stackoverflow.com的链接发布评论时,它将保存在我的XML文档中,如下所示:

<a href="www.stackoverflow.com">www.stackoverflow.com</a>

在我的非工作功能中,是关于我认为应该如何完成的注释,尽管我不确定如何实现。

考虑寻找链接,然后将链接元素替换为其内容的文本节点。以下内容将替换页面中的每个链接:

windowonload = function() {

  var links = document.links;
  var link, node;
  var i = links.length;

  while (i--) {
    link = links[i];
    node = document.createTextNode(link.textContent || link.innerText);
    link.parentNode.replaceChild(node, link);
  }
};

考虑寻找链接,然后将link元素替换为其内容的文本节点。以下内容将替换页面中的每个链接:

windowonload = function() {

  var links = document.links;
  var link, node;
  var i = links.length;

  while (i--) {
    link = links[i];
    node = document.createTextNode(link.textContent || link.innerText);
    link.parentNode.replaceChild(node, link);
  }
};

这应该行得通,但是可能有更有效的方法。 我测试了性能,它似乎比公认的解决方案快得多,但我想它可能不那么可靠。这是测试

函数转换链接编辑(文本){

var rx=/]*?href=“([^“]+)”[^>]*>[^这应该会起作用,但是可能有更有效的方法。 我测试了性能,它似乎比公认的解决方案快得多,但是我想它可能不那么可靠

函数转换链接编辑(文本){

var rx=/*?href=“([^“]+)”[^>]*>[^您可以使用正则表达式查找
href
。因为您的单词将是
href=“someurl”>


假设您的链接是按照我前面提到的那样创建的,并且您的href属性具有
而不是
引号。

您可以使用regex查找
href
。因为您的单词将是
href=“someurl”>


假设您的链接是按照我前面提到的那样创建的,并且您的href属性具有
而不是
引号。

实际上,DOM足够聪明,可以为您将链接解析为文本,因此您可以简单地使用:

函数转换链接编辑(文本){
//只需创建一个空的元素
var dummy=document.createElement('p');
//将其HTML内容更改为注释内容
dummy.innerHTML=文本;
//返回我们的
返回dummy.textContent | | dummy.innerText;//我们首先查找textContent*(较新的浏览器),如果需要,返回innerText(较旧的浏览器)
}
*有关文本内容的信息,请查看此处:

不过,我不知道上面的浏览器兼容性,因此,RobG的变体应用于您的功能:

function convertLinkEdit(text) {
    var dummy = document.createElement('p');
    dummy.innerHTML = text;
    
    var links = dummy.getElementsByTagName('a');
    
    for (var i = 0, l = links.length; i < l; i++)
    {
        var link = links[i];
        var node = document.createTextNode(link.textContent || link.innerText);
        link.parentNode.replaceChild(node, link);
    }
    
    return dummy.textContent || dummy.innerText;
}
函数转换链接编辑(文本){
var dummy=document.createElement('p');
dummy.innerHTML=文本;
var links=dummy.getElementsByTagName('a');
对于(变量i=0,l=links.length;i
仅供参考:您应该始终使用及其API来解析/操作HTML。强烈建议不要将正则表达式用于HTML解析。
是的,它在某些情况下可能会工作,但您无法控制它,因为它无法正确区分属性、元素和DOM带来的所有其他混乱

更新: 这是一个更新版本

问题是,正如plaxl已经指出的那样,
getElementsByTagName
和任何其他
getElement..
家族成员将返回一个节点列表,该节点列表是活动对象。一旦节点列表中的某个元素发生更改,它将自动更新

我添加了一个小片段,它将在进入转换循环之前将NodeList转换为简单数组


尽管如此,如果函数的第一个版本适合您,请使用该版本,它应该比2次循环快得多。

实际上,DOM足够智能,可以为您将链接解析为文本,因此您可以简单地使用:

函数转换链接编辑(文本){
//只需创建一个空的元素
var dummy=document.createElement('p');
//将其HTML内容更改为注释内容
dummy.innerHTML=文本;
//返回我们的
返回dummy.textContent | | dummy.innerText;//我们首先查找textContent*(较新的浏览器),如果需要,返回innerText(较旧的浏览器)
}
*有关文本内容的信息,请查看此处:

不过,我不知道上面的浏览器兼容性,因此,RobG的变体应用于您的功能:

function convertLinkEdit(text) {
    var dummy = document.createElement('p');
    dummy.innerHTML = text;
    
    var links = dummy.getElementsByTagName('a');
    
    for (var i = 0, l = links.length; i < l; i++)
    {
        var link = links[i];
        var node = document.createTextNode(link.textContent || link.innerText);
        link.parentNode.replaceChild(node, link);
    }
    
    return dummy.textContent || dummy.innerText;
}
函数转换链接编辑(文本){
var dummy=document.createElement('p');
dummy.innerHTML=文本;
var links=dummy.getElementsByTagName('a');
对于(变量i=0,l=links.length;i
仅供参考:您应该始终使用及其API来解析/操作HTML。强烈建议不要将正则表达式用于HTML解析。
是的,它在某些情况下可能会起作用,但你无法控制它,因为它不会起作用
function convertLinkEdit(text) {
    // simply create an empty <p> element
    var dummy = document.createElement('p');
    
    // change it's HTML contents to the comment one
    dummy.innerHTML = text;

    // return the TEXT value of our <p>
    return dummy.textContent || dummy.innerText; // we first look up textContent* (newer browsers) and fall back to innerText (older browsers) if needed
}
function convertLinkEdit(text) {
    var dummy = document.createElement('p');
    dummy.innerHTML = text;
    
    var links = dummy.getElementsByTagName('a');
    
    for (var i = 0, l = links.length; i < l; i++)
    {
        var link = links[i];
        var node = document.createTextNode(link.textContent || link.innerText);
        link.parentNode.replaceChild(node, link);
    }
    
    return dummy.textContent || dummy.innerText;
}