replace()给出了意想不到的结果

时间:2017-02-23 14:42:20

标签: javascript regex

我正在尝试编写一个脚本,它将从clyp(一个音频剪辑网站)中找到所有链接。我对js很缺乏经验,所以如果我的代码很糟糕,请原谅我。

在我的例子中,无论我做什么,我都无法得到代码'变量返回任何内容,即使它与'替换'具有相同的语法。变量

这是我到目前为止所做的:

体:

<div class="body"><a href="https://clyp.it/mo3nehzm" rel="nofollow" target="_blank">https://clyp.it/mo3nehzm</a></div>

JS:

function clyp() {
var length = document.getElementsByClassName("body").length
for (i = 0; i < length; i++) {
    var body = document.getElementsByClassName("body")[i];
    var body2 = body.innerHTML;
    var code = body2.replace(/([>])(https:\/\/clyp.it\/)([\w]{8})/, "$3");
    var replace = body2.replace(/([>])(https:\/\/clyp.it\/)([\w]{8})/, "$1$2$3");
    body.innerHTML = replace.concat(code);
}
}
clyp();

小提琴:

https://jsfiddle.net/mzrt/8zmuktey/

这不是最终产品。 js中的最后一行仅用于显示&#39;代码&#39;没有回来任何东西。

感谢您的阅读和帮助。

4 个答案:

答案 0 :(得分:1)

试试这个:

const clyp = data => data.replace(/(<a.*?>).*?https:\/\/clyp\.it\/(.*?)(<\/a>)/g, '$1$2$3')

const clypAll = selector => {
    const selected = document.querySelectorAll(selector)
    for(let i = 0; i < selected.length; i++) {
        selected[i].innerHTML = clyp(selected[i].innerHTML)
    }
}

clypAll('.body')
<div class="body"><a href="https://clyp.it/mo3nehzm" rel="nofollow" target="_blank">https://clyp.it/mo3nehzm</a></div>

答案 1 :(得分:1)

生成变量代码的替换语句正在删除&#34;&gt;&#34;关闭锚标签。它应该看起来像:

var code = body2.replace(/([>])(https:\/\/clyp.it\/)([\w]{8})/, "$1$3")

答案 2 :(得分:1)

尝试查看包含html标签的结果变量rendering html本身是一个坏主意,除非你总是想检查源代码。

code变量中,实际上是这样的:

<a href="https://clyp.it/mo3nehzm" rel="nofollow" target="_blank"mo3nehzm</a>

因此,您生成一个html标记,它不仅无效,而且empty无效,因此不会显示任何内容。因此,您还会看到这是$3的内容,这意味着您的正则表达式与您期望的匹配不匹配。

因此,您需要将其替换为$1$3以获取有效的HTML - 或者使用不同的正则表达式或不同的方法。

var code = body2.replace(/([>])(https:\/\/clyp.it\/)([\w]{8})/, "$1$3");

导致

<a href="https://clyp.it/mo3nehzm" rel="nofollow" target="_blank">mo3nehzm</a>

答案 3 :(得分:1)

如果您只想收到最后8个字符,可以执行以下操作:

function clyp() {
  var elements = document.getElementsByClassName("body");
  var regex = /href=.*clyp\.it\/(.*?)"/g;
  for (i = 0; i < elements.length; i++) {
      var innerHTML = elements[i].innerHTML;
      var code = regex.exec(innerHTML)[1];
      document.body.innerHTML += code;
  }
} clyp();

https://jsfiddle.net/mzrt/8zmuktey/