JavaScript:遇到空格后从字符串中提取URL

时间:2016-09-20 11:23:29

标签: javascript regex

我不擅长正则表达式,但我想从字符串后跟空格中提取URL。例如,我有一个字符串:

I am working on a website http://www.example.com/ and I want to find this URL.

最接近的正则表达式是

/(^https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,10})([\/\w \.-]*)*\/?$/i

但它需要选择URL后跟一个空格,而不仅仅是在域扩展名的两个字符之后。请帮忙。

5 个答案:

答案 0 :(得分:0)

我已经为您准备了一个小演示:http://codepen.io/PiotrBerebecki/pen/qaqdNA

以下情况会对您有所帮助吗?

var str = 'I am working on a website http://www.example.com/ and I want to find this URL.'

// capture whole url, including trailing space
var url = (str.match(/http[^\s]*[\s]/) || [])[0]
console.log(url); // 'http://www.example.com/ '

// capture url without http, include trailing space
var urlNoHttp = (str.match(/(?:http:\/\/)(.*?\s)/) || [])[1];
console.log(urlNoHttp); // 'www.example.com '

答案 1 :(得分:0)

我已经将你的正则表达式重新制作成符合你想要的东西,我相信:

/(?:https?:\/\/)?(?:www\.)?(?:[\da-z-]+\.)+[a-z]{2,10}(?:\/[^\s/]+)*\/?\s/gi

See in Regex101



var regex = /(?:https?:\/\/)?(?:www\.)?(?:[\da-z-]+\.)+[a-z]{2,10}(?:\/[^\s/]+)*\/?\s/gi;

var lines = [
  "You can match a URL http://subdomain.domain.com which includes a subdomain",
  "But not one that...this uses the http protocol (see http://example.com)",
  "I am working on a website http://example.com/ and I want to find this URL.", 
  "This URL www.example.com will also match",
  "The URL example.com will match again",
  "You can have http://example.com several urls www.example.com in the example.com text you are parsing",
  "URLs containing trailing information example.com/foo/bar will be matched",
  "and complex URLS like http://subdomain.domain.com/foo/bar/file.txt/baz?param=value&param2=img.jpg#cointainsHash can also be matched",
  "although invalid looking URLs like http://example.com///foo will not be",
  "It will also fail if it's at the end of the line http://example.com"
]

lines.forEach(string => console.log(string, string.match(regex)))




说明:

正则表达式组件

(?:https?:\/\/)? - 可选择以 http:// https:// 开头。这是在非捕获组中包围的。

(?:www\.)? - 可选择从 www。开始。注意:这实际上是多余的,因为模式的下一部分将与之匹配。它可以省略,但如果更改了域模式,则可能需要它。

(?:[\da-z-]+\.)+捕获URL的一个或多个组件,每个组件应包含一个或多个字母数字,点或短划线字符后跟一个点。这将匹配确保您选择子域名,例如subdomain.example.com或TLD组件,例如example.co.uk或两者:subdomain.example.co.uk以及基本域名。

[a-z]{2,10}匹配最终TLD的两到十个字母

(?:\/[^\s/]+)*非匹配组,其中包含正斜杠,后跟一个或多个非空格或正斜杠的字符。该小组会重复任意次,以便考虑/foo的{​​{1}}和/bar部分。 example/foo/bar的排除确保只有正斜杠之间的内容匹配,排除空白确保它不会超出"溢出"并在URL后意外匹配空格。 黑名单字符背后的原因是内容可以变化,包括点,短划线,下划线甚至其他字母表中的字符,以及查询参数(利用/? )URL哈希(使用&)或组合。假设您不想接受所有字符,则应限制此操作。如果您要验证网址的有效性,例如,确保#?param=value之前来到并且被{{1}正确隔开然后那些匹配需要分开。另一方面,这将是一个相当严厉的验证 - 对于大多数情况,仅使用#hash就足以识别有效的URL。

URL末尾的

&可选正斜杠

[^\s/]必须匹配任何空格字符。如果你想要一个文字空间,那么如果要在输入字符串的末尾捕获一个URL,则将其更改为空格字符\/?,然后将其更改为\s取决于您是想要任何空格还是空格字符。

<强>标志

(?:\s|$)不区分大小写的匹配

(?: |$)全局匹配 - 它将返回字符串中的所有网址。如果删除,它将返回一个。

我删除了一些分组,因为它们是多余的。

警告:此正则表达式适用于拉丁字符。例如,西里尔文或中文的域名将不匹配。使用核心JavaScript几乎无法做到这一点,因为目前它没有Unicode支持。如果您想支持这些,那么我建议使用第三方正则表达式库,如XRegExp。另一种方法是重写这个正则表达式而不提及任何字母,但是,它很可能容易被标记为误报。

更多注意事项:这不符合所有有效的网址,但它符合提议的限制。例如,i将不匹配,但g之类的内容将会匹配,因为它包含可以解释为子域的组件。此外,TLD不会被确保有效 - 除了非拉丁语TLD,有些可能包含超过10个字符。假设您不需要确保URL的总有效性,但只想匹配看起来像一个的东西,这将有效。

答案 2 :(得分:-1)

尝试以下正则表达式:

rxp = / http[^ ]+/

这将匹配一个后跟http的空格并抓住所有内容直到找到空格

然后做:

stringWithURL.match(rxp)[0].slice(1)

这将剥离第一个空格字符并返回一个字符串而不是一个数组。

对于案件:

stringWithURL = "I am working on a website http://www.example.com/ and I want to find this URL."

将给出结果:

"http://www.example.com/"

如果你想在键入时捕获它,那么在每次击键后进行捕获,结果会一直增长,直到键入空格,然后URL就会完成。

答案 3 :(得分:-1)

您已经在使用正则表达式,只需在它前面添加一个空格,以便要求它成为一个新单词:

/ (ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/i

只要前面有空格,就会匹配文本块中最常见的URL。此解决方案也接受ftp,但如果您只想要http / https,则可以从列表中删除它:

/ (http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/i

归功于@Roman的初始解决方案。

答案 4 :(得分:-1)

另一种解决方案:

&#13;
&#13;
var str='I am working on a website http://www.example.com/ and I want to find this URL.';
var Matches = (/http(.*?)\s/g).exec(str);
console.log(Matches);
&#13;
&#13;
&#13;

P.S。如果你想要ftp:/或其他类型的方案,请自己调整脚本。