正则表达式问题,请捕获直到找到空格或结束行

问题描述 投票:0回答:2

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

“ 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);

但是它也总是带来“另一个词”,而不是仅仅带来空格。

php regex preg-match
2个回答
0
投票

.是贪婪的,除非使用?或修改的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/


0
投票

捕获直到第一个空格的一种方法是使用\S+,它匹配一个或多个非空格字符的任何序列:

url:?\s*(\S+)

通过使用i标志,我们可以避免不必测试UrlurlURL等。我们可以使用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

Demo on 3v4l.org

© www.soinside.com 2019 - 2024. All rights reserved.