正则表达式问题,捕获直到找到 space 或 endline

Regex trouble, capture until find space or endline

我正在尝试捕获以下匹配项:

"url: https://www.anysite/anything"

但有时字符串会出现:

"url: https://www.anysite/anything another word"

但我只想匹配

"url: https://www.anysite/anything"

是否"another word"来了。

所以,我的逻辑是捕获,直到找到 url 地址之后的第一个 space,或者字符串的结尾。 我在 PHP 中的正则表达式是:

preg_match("/(Url|url)(\:|\b)(\s\b|\b).+(\s|$)/",$linestring,$url_string);

但它总是会带来 "another word",而不是只带来 space。

. 是贪婪的,除非使用 ?U 修改量词变得不贪婪。

(Url|url)(\:|\b)(\s\b|\b).+?(\s|$)

您实际上可以进一步简化它:

[Uu]rl(?::|\b)\s?\b.+?(?:\s|$)

如果你想要 URL 位用 () 捕获 .+?

[Uu]rl(?::|\b)\s?\b(.+?)(?:\s|$)

https://regex101.com/r/urq2fM/2/

捕获第一个 space 之前的一种方法是使用 \S+,它匹配一个或多个非 space 字符的任意序列:

url:?\s*(\S+)

通过使用 i 标志,我们可以避免必须测试 UrlurlURL 等。我们可以使用 preg_replace 来简化用法,仅用捕获的组替换字符串:

$url = preg_replace('/url:?\s*(\S+).*/i', '', $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', '', $string);
    echo "$url\n";
}

输出:

https://www.anysite/anything
https://www.anysite/anything

Demo on 3v4l.org