Regex неприятности, захватывать, пока не найдете пробел или конец - PullRequest
1 голос
/ 11 февраля 2020

Я пытаюсь получить следующее совпадение:

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

Но иногда приходит строка:

"url: https://www.anysite/anything другое слово"

Но я просто хочу соответствовать

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

, независимо от того, приходит" другое слово "или нет.

Итак, мой лог c захватывается до тех пор, пока не будет найден первый пробел после URL-адреса или конца строки. Мой REGEX IN PHP такой:

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

Но он всегда приносит и «другое слово», а не только до пробела.

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Один из способов захвата до первого пробела - использовать \S+, что соответствует любой последовательности из одного или нескольких непробельных символов:

url:?\s*(\S+)

Используя флаг i, мы можем избежать необходимо проверить на Url или url или URL et c. Мы можем использовать 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

Демо на 3v4l.org

1 голос
/ 11 февраля 2020

. является жадным, если квантификатор не будет изменен на ? или 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/

...