匹配两个单词之间的所有内容,而匹配的最后一个单词是可选的

matching everything between two words, while last word being matched is optional

我需要捕获 'one' 和 'four' 之间的所有内容,'four' 是可选的。我们不知道 'one' 和 'four' 之间是什么。我尝试匹配它,但没有得到正确的结果。我做错了什么?

$text = "one two three four five six seven eight nine ten";
preg_match("~one( .+)(four)?~i", $text, $match);

print_r($match);

结果:

Array ( [0] => one two three four five six seven eight nine ten [1] => two three four five six seven eight nine ten )

需要结果:

Array ( [0] => one two three four five six seven eight nine ten [1] => two three [3] => four)

PS: 是的,'four' 需要是可选的。

默认情况下,重复运算符(如“?”、“*”、“+”或 {n,m})是贪婪的 - 它们会尝试匹配尽可能多的符号。您可以在这里阅读更多内容:What do lazy and greedy mean in the context of regular expressions?

为了让他们不贪心加上“?”在他们之后。像这样: “~一(。+?)(四)?~我”

这里需要用到交替运算符

one(( .+)(four).*|.*)

DEMO