使用正则表达式在javascript中用链接替换每个链接的特定href对象(map link - > a href = link)

时间:2018-04-16 11:16:42

标签: javascript node.js regex react-native

我需要替换

 "wjjghwkjghwkjgh https://www.google.com jhgkwjhgkwhgk https://youtube.com"

 "wjjghwkjghwkjgh <a href='https://www.google.com'>https://www.google.com</a> jhgkwjhgkwhgk <a href='https://youtube.com'>https://youtube.com</a>";

我已经使用正则表达式链接和示例消息提供了https://jsbin.com/kosogijudo/1/edit?js,console草案

我不知道该怎么做,因为如果我创建一个循环,它会正确地修改第一个循环,但在第二次迭代中它会在标记内再次修改。

我认为有一种方法可以指定一个采用link和输出<a href="link">link</a>

的映射函数

顺便说一句,所有这一切都是因为我需要使用https://github.com/jsdf/react-native-htmlview on native来显示文本视图中的链接。如果在React Native本身有一种现代化的方法,那么它也会很棒。

4 个答案:

答案 0 :(得分:1)

你可以尝试一下

var string = "wjjghwkjghwkjgh https://www.google.com jhgkwjhgkwhgk https://youtube.com";
string.split(' ');
var answer = string.map(m => (m.includes('https') && [`<a href=${m}>${m}</a>`].join(m)) || m).join(' ');

答案 1 :(得分:0)

您可以通过传递replacer函数作为第二个参数来使用replace方法。 More details on MDN about the parameters

为每个匹配调用replacer函数,它的返回值用于替换字符串中的原始匹配。这是一个示例,希望它有所帮助

&#13;
&#13;
var regexp = /(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9]\.[^\s]{2,})/gi;

var test = 'wjjghwkjghwkjgh https://www.google.com jhgkwjhgkwhgk https://youtube.com'

var replaced = test.replace(regexp,function(match){
	return `<a href="${match}">${match}</a>`;
})

console.log(replaced); //wjjghwkjghwkjgh <a href="https://www.google.com">https://www.google.com</a> jhgkwjhgkwhgk <a href="https://youtube.com">https://youtube.com</a>
&#13;
&#13;
&#13;

答案 2 :(得分:0)

您可以尝试以下方式:

&#13;
&#13;
var str = "wjjghwkjghwkjgh https://www.google.com jhgkwjhgkwhgk https://youtube.com";

str = str.split(' ');
str = str.map( function(s){
  if(s.startsWith('https://')){
    s = '<a href=' + '\"' +s + '\"' + '>' + s + '</a>'
  }
  return s;
}).join(' ');

console.log(str)
&#13;
&#13;
&#13;

答案 3 :(得分:0)

  1. 您没有将匹配的字符串包装在<a>标记
  2. 您没有捕获URL(使用Regex捕获组),因此$ 1错误
  3. 在正则表达式(全局)之后添加g标志,因此它会处理字符串中的多个URL
  4. const linkRegex = /(https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*))/g
    
    let message = "wjjghwkjghwkjgh https://www.google.com jhgkwjhgkwhgk https://youtube.com";
    
    message = message.replace(linkRegex, "<a href='$1'>$1</a>") // Wrap in <a>
    
    console.log(message)