如何使用preg_match组?

时间:2016-02-17 23:13:54

标签: php regex 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);

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

1 个答案:

答案 0 :(得分:1)

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

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]+)?) - 第3组Word WordWord模式
  • \s+ - 一个或多个空格
  • ([0-9]+) - Number模式
  • 的第4组
  • $ - 字符串结尾

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

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