2016-02-17 68 views
2

我有一些数据,这将是以下如何使用preg_match组?

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

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

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

但是,该数组是空的。我知道我已经看到^+$之前使用,但我不太清楚如何将它工作到正则表达式。

+0

你的意思'Number'是*位数*? – Shafizadeh

+0

尝试'preg_match_all( '/([A-ZA-Z] +)([0-9] +)([A-ZA-Z] +)([0-9] +)/',$游戏,$信息);'或'preg_match_all( '/ ^([A-ZA-Z] +)([0-9] +)([A-ZA-Z] +)([0-9] +)$ /' ,$游戏,$信息);'。 –

+0

@Shafizadeh对不起。字如一串字母(中间有可能的空间),然后是空格,然后是数字,然后是空格,然后是字母串(有可能的空间),然后是数字。 – cantsay

回答

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]+)?)的开始 - 第1组为Word WordWord图案
  • \s+ - 的一个或多个空格
  • ([0-9]+) - 第2组为Number
  • \s+ - 的一个或多个空格
  • ([a-z]+(?:\s+[a-z]+)?) - 第3组为Word WordWord图案
  • \s+ - 的一个或多个空格
  • ([0-9]+) - 4组为Number图案
  • $ - 串

的末端的/i改性剂使图案不区分大小写的。 /m改性剂仅用于测试(它使^$匹配开始和线,而不是整个字符串的末尾)。

[a-z]+(?:\s+[a-z]+)?的子模式是指*匹配[a-z]+一个或多个字母,然后匹配的一个或多个空格(\s+)的序列的一个或一个零发生,接着与一个或多个字母([a-z]+)。因此,这种模式有效匹配1或2个词,用空格分隔。

+0

看起来很复杂,但它完美的作品。我将学习关于regextester的解释。谢谢。 – cantsay

+1

我在答案中添加了所有相关详细信息。 –

+1

谢谢,非常清楚的解释。 – cantsay