我不擅长正则表达式,但我想从字符串后跟空格中提取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后跟一个空格,而不仅仅是在域扩展名的两个字符之后。请帮忙。
答案 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
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¶m2=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。
&
可选正斜杠
[^\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)
另一种解决方案:
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;
P.S。如果你想要ftp:/
或其他类型的方案,请自己调整脚本。