我正在尝试捕获以下匹配项:
“ url:https://www.anysite/anything”
但是有时候字符串来了:
“ URL:https://www.anysite/anything另外一个字”
但是我只想匹配
“ url:https://www.anysite/anything”
无论“另一个词”是否到来。
因此,我的逻辑被捕获,直到找到URL地址或字符串末尾的第一个空格。我在PHP中的REGEX是:
preg_match("/(Url|url)(\:|\b)(\s\b|\b).+(\s|$)/",$linestring,$url_string);
但是它也总是带来“另一个词”,而不是仅仅带来空格。
.
是贪婪的,除非使用?
或修改的U
使量词不贪婪。
(Url|url)(\:|\b)(\s\b|\b).+?(\s|$)
您实际上可以进一步简化它:
[Uu]rl(?::|\b)\s?\b.+?(?:\s|$)
如果您希望URL位用.+?
捕获()
。
[Uu]rl(?::|\b)\s?\b(.+?)(?:\s|$)
捕获直到第一个空格的一种方法是使用\S+
,它匹配一个或多个非空格字符的任何序列:
url:?\s*(\S+)
通过使用i
标志,我们可以避免不必测试Url
或url
或URL
等。我们可以使用preg_replace
简化用法,仅将字符串替换为捕获的组:
$url = preg_replace('/url:?\s*(\S+).*/i', '$1', $string);
例如
$strings = array("url: https://www.anysite/anything",
"url: https://www.anysite/anything another word");
foreach ($strings as $string) {
$url = preg_replace('/url:?\s*(\S+).*/i', '$1', $string);
echo "$url\n";
}
输出:
https://www.anysite/anything
https://www.anysite/anything