我有这样的正则表达式
((?:^|\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中使用
答案 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);