在白色空间拆分句子并找到一个单词

时间:2013-04-03 03:03:49

标签: javascript html anchor hyperlink

好吧,这是一个微笑的问题,我被困住了。我试图创建一个HTML文本框,在提交时,文本被抛入一个函数并检查是否有任何链接。如果有链接,它将被包装在锚标记中并制作成可点击链接。

所以我得到了那个部分,但我创建了一个编辑功能。因此,当在评论上按下编辑按钮时,会显示带有创建的评论的弹出窗口。注释的值(取自XML文件)放在此编辑文本区域的值中。但是链接的价值仍然有锚标签,所以它看起来非常混乱。

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

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

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

如果用户在开头使用http://发布链接,它也适用。

我现在正试图将链接恢复为以前的正常文本。

以下是我的两个功能。第一个,convertLink完美无缺。 convertLinkEdit试图恢复这个过程,但我没有运气。

function convertLink(text) {
  var words = text.split(' ');
  var newText = '';

  for (var i = 0; i < words.length; i++) {
    var word = words[i];
    if (word.indexOf('http://') === 0) {
      word = '<a href=" ' + word + ' ">' + word + '</a>';
    } else if (word.indexOf('www.') === 0) {
      word = '<a href=" http://' + word + '" >' + word + '</a>';
    }

    newText += word + ' ';
  }

  return newText;
}

function convertLinkEdit(text) {
  var words = text.split(' ');
  var newText = '';

  for (var i = 0; i < words.length; i++) {
    var word = words[i];
    if (word.indexOf('href=') === 0) {
      //if index of finds "href=", it means a link is coming up
      //Therefore, since everything is split at blank spaces,
      //after the next blank space will be the current text that needs saving
    }

    newText += word + ' ';
  }

  return newText;
}

在我的非工作函数内部是关于我认为应该如何完成的评论,尽管我不确定如何实现。

4 个答案:

答案 0 :(得分:2)

实际上,DOM非常聪明,可以为您解析链接到文本,因此您只需使用this (link to jsFiddle)

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
}

* 有关textContent的信息,请查看此处:https://developer.mozilla.org/en-US/docs/DOM/Node.textContent

我不知道上面的浏览器兼容性,所以,here is (link to jsFiddle) 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;
}

仅供参考:您应始终使用DOM及其用于解析/操作HTML的API。强烈建议不要使用正则表达式进行HTML解析 是的,它可能在某些情况下有效,但你无法控制它,因为它无法正确区分属性,元素和DOM附带的所有其他混乱。

更新

http://jsfiddle.net/2b8uz/5/这是更新版本。

问题是,正如plaxl已经指出的那样,getElementsByTagName和任何其他getElement..家庭成员将返回一个Live对象的NodeList。一旦NodeList中的元素发生变化,它就会自动更新。

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

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

答案 1 :(得分:1)

这应该有效,但是可能有更有效的方法。 我测试了性能,它似乎比公认的解决方案更快,但我想它可能不那么可靠。这是测试http://jsperf.com/replace-links

 function convertLinkEdit(text) {
    var rx = /<a [^>]*?href="([^"]+)"[^>]*>[^<]*<\/a>/g;

    convertLinkEdit = function (text) {
        return text.replace(rx, '$1');
    };

    return convertLinkEdit(text);

}

答案 2 :(得分:0)

考虑查找链接,然后将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);
  }
};

答案 3 :(得分:0)

您可以使用正则表达式查找href。由于您的字词为href="someurl">

var res = word.match(/^href="(.+)">/;
if (res && res.length == 2) 
{
     //res[1] will be your url, do whatever you want with it
}

假设您的链接是按照我之前提到的那样创建的,并且您的href属性包含"而不是'引用。