正则表达式,选择链接从空间开始,但从选择中排除空格

时间:2017-02-08 12:05:07

标签: javascript regex

我有这样的正则表达式

((?:^|\s)https?:\/\/[^\s]+|(?:^|\s)www\.[^\s]+)

https://regex101.com/r/TwD0S3/2

它必须匹配文本中从空格开始的所有链接,或者在它们之前没有任何内容,并且一切都很好,但是必须从匹配的链接中排除空格(如果存在)。有可能吗? html代码中的链接不能匹配,所以

<img src="http://link.dev/static/images/svg/logo.svg">

必须完全忽略。

Regexp将在JavaScript中使用

1 个答案:

答案 0 :(得分:1)

您可以使用捕获组来获取您感兴趣的内容。要使正则表达式正常工作,只需使用http()部分包裹起来。此外,它可以增强一点,使匹配更加线性:

/(?:^|\s)((?:https?:\/\/|www\.)[^\s<>"']+)/gi

请参阅regex demo,您需要的字符串在第1组内。

var rx = /(?:^|\s)((?:https?:\/\/|www\.)[^\s<>"']+)/ig;
var str = 'http://link.dev/static/images/svg/logo1.svg\n<img src="http://link.dev/static/images/svg/logo2.svg">\nthis is simple text www.link.dev/static/images/svg/logo3.svg \nor https://link.dev/static/images/svg/logo4.svg';
var res=[],m;

while ((m = rx.exec(str)) !== null) {
  res.push(m[1]);
}

console.log(res);

但是,要避免在<>之间匹配网址,您可以将这些子字符串与<[^<]*>匹配(使用|替换运算符将其添加为替代分支),并在其他地方捕获URL(regex demo):

/<[^<]*>|((?:https?:\/\/|www\.)\S+)/gi

var rx = /<[^<]*>|((?:https?:\/\/|www\.)\S+)/gi;
var str = 'http://link.dev/static/images/svg/logo1.svg\n<img src="http://link.dev/static/images/svg/logo2.svg">\nthis is simple text www.link.dev/static/images/svg/logo3.svg \nor https://link.dev/static/images/svg/logo4.svg';
var res=[],m;

while ((m = rx.exec(str)) !== null) {
  if (m[1]) res.push(m[1]);
}

console.log(res);