如何使用 preg_match 的群组?

How can I use groups with preg_match?

我有一些数据将是以下之一

Word Number Word Number  
Word Number Word Word Number  
Word Word Number Word Number  
Word Word Number Word Word Number

我想提取直到数字和数字的单词。这是我目前拥有的(对我来说看起来不错,但我不完全理解正则表达式)。

    preg_match('/([A-Za-z ])([0-9])([A-Za-z ])([0-9])/', $game, $info);
    print_r($info);

然而,数组是空的。我知道我以前见过 ^+ 以及 $,但我不太确定如何将其用于正则表达式。

为了将字符串与您描述的格式相匹配,您需要

preg_match_all('/^([a-z]+(?:\s+[a-z]+)?)\s+([0-9]+)\s+([a-z]+(?:\s+[a-z]+)?)\s+([0-9]+)$/im', $game, $info);

regex demo

IDEONE demo:

$re = '~^([a-z]+(?:\s+[a-z]+)?)\s+([0-9]+)\s+([a-z]+(?:\s+[a-z]+)?)\s+([0-9]+)$~im'; 
$game = "Word 123 Word 456\nWord 1234 Word Word 3456\nWord Word 3455 Word 4566\nWord Word 4434 Word Word 44332"; 
preg_match_all($re, $game, $info);
print_r($info);

正则表达式解释:

  • ^ - 字符串开头
  • ([a-z]+(?:\s+[a-z]+)?) - Word WordWord 模式的第 1 组
  • \s+ - 一个或多个空格
  • ([0-9]+) - Number
  • 的第 2 组
  • \s+ - 一个或多个空格
  • ([a-z]+(?:\s+[a-z]+)?) - Word WordWord 模式的第 3 组
  • \s+ - 一个或多个空格
  • ([0-9]+) - Number 模式的第 4 组
  • $ - 字符串结尾

/i 修饰符使模式不区分大小写。 /m 修饰符仅用于测试(它使 ^$ 匹配 的开始和结束,而不是整个字符串)。

[a-z]+(?:\s+[a-z]+)? 子模式表示*用 [a-z]+ 匹配一个或多个字母,然后匹配一个或零个出现的一系列一个或多个空格 (\s+),后跟一个或更多字母 ([a-z]+)。因此,此模式有效匹配用空格分隔的 1 或 2 个单词