使用正则表达式从字符串中提取URL

3

我想从一个字符串中提取第一个有效的URL,该URL可以在字符和空格之间的任何位置。

我已尝试使用以下方法:

...
urlRegex: /^(http[s]?:\/\/.*?\/[a-zA-Z-_]+.*)$/,

...
var input = event.target.value // <--- some string;
var url   = input.match(this.urlRegex);

问题是url在找到一个URL时返回整个字符串,而不是仅返回与正则表达式匹配的部分。
示例 该字符串 https://medium.com/aspen-ideas/there-s-no-blueprint-26f6a2fbb99c random stuff sd 返回
["https://medium.com/aspen-ideas/there-s-no-blueprint-26f6a2fbb99c random stuff sd", "https://medium.com/aspen-ideas/there-s-no-blueprint-26f6a2fbb99c random stuff sd", index: 0, input: "https://medium.com/aspen-ideas/there-s-no-blueprint-26f6a2fbb99c random stuff sd"]

这怎么能实现呢?

不使用 http(s):// 的 URL 怎么办?比如 ftp:// 等等? - zb'
URL可以包含各种类型的字符,包括特殊字符吗? - Braj
请点击此处查看 https://stackoverflow.com/q/6038061/1066234 - undefined
3个回答

14

你的正则表达式不正确。

提取URL的正确正则表达式:/(https?:\/\/[^ ]*)/

查看这个演示

以下是代码片段。

var urlRegex = /(https?:\/\/[^ ]*)/;

var input = "https://medium.com/aspen-ideas/there-s-no-blueprint-26f6a2fbb99c random stuff sd";
var url = input.match(urlRegex)[1];
alert(url);


只有返回 / 后面的部分,而且只有第一个片段。我想要整个URL。 - Tarlen
那是因为你做错了。像这样分组... /^(http[s]?:\/\/.*?\/[a-zA-Z-_]+.*)$/ - Shrinivas Shukla
更新了我的回答。请试一下。 - Shrinivas Shukla
这也适用于下一行,当URL位于前一行的末尾时。 - undefined

3
  • 您的正则表达式中没有包含数字作为 URL 的一部分。
  • 假设 URL 从字符串的开头开始。

带有左侧正则表达式解释的实时演示

正则表达式解释

var regex = /^(https?:\/\/[^/]+(\/[\w-]+)+)/;
var str = 'https://medium.com/aspen-ideas/there-s-no-blueprint-26f6a2fbb99c random stuff sd';

var url = str.match(regex)[0];
document.write(url);


-1

这是因为match结果首先包含匹配的整个字符串,然后才是组。我猜你想要组,所以你可以这样做:

url[1]

这是一个编程挑战: http://jsfiddle.net/jgt8u6pc/1/

var urlRegex = /^http[s]?:\/\/.*?\/([a-zA-Z-_]+).*$/;
var input = 'https://dev59.com/2I3da4cB1Zd3GeqP2qOc' // <--- some string;
var url = input.match(urlRegex);

$('#one').text(url[0]);
$('#two').text(url[1]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="one"></div>
<div id="two"></div>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接