2016-02-17 91 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