2011-05-20 25 views
1

我有可以是這樣的數據:正則表達式匹配:檢查是否可選項目存在

LL DD L LL DDDD 

或類似:

LL DD L DDDD 

其中L是字母,d是數字

DD組可以是:「1」...「9」,「10」...「99」

與任何數量的空格,破折號或任何之間沒有空格米或其中一些。

如何在php中構建正則表達式來檢測所有這些情況?

我使用這個(我可以看到的是不完美):

preg_match_all('/[A-Za-z]{2}(-\.)*?\d{1,2}(-\.)*?[A-Z]{1,3}(-\.)*?\d{4}/',$file,$matches); 

回答

1

假設d是一個單一的數字和L一個字母:

$regex = '/([a-z]{2}(-\.)*[0-9]{2}(-\.)*[a-z](-\.)*([a-z]{2}(-\.)*)?[0-9]{4})/Ui' 
1

我覺得你模式要的是

preg_match_all('/[a-z]{2}[ -]*\d{1,2}[ -]*[a-z]([ -]*[a-z]{2})?[ -]*\d{4}/i',$file,$matches); 

這符合:兩個字母,然後任意數量的空格或破折號,後面跟着一個或兩個數字,隨後ny個空格或短劃線,後跟一個字母,後面可以跟隨(任意數量的空格或破折號,後跟兩個字母),後跟任意數量的空格或破折號,後跟四個數字。

/i修飾符也使其不區分大小寫。

1

嘗試:

preg_match_all('[A-Za-z]{2}[-\s]*\d{1,2}[-\s]*[a-zA-Z][-\s]*[a-zA-Z]{2}[-\s]*\d{4}',$file,$matches); 

編輯:

是我不好,我想你的意思是空白(而不是空間)。在FF的正則表達式將只需要空間(而不是空格):

preg_match_all('[A-Za-z]{2}[- ]*\d{1,2}[- ]*[a-zA-Z][- ]*[a-zA-Z]{2}[- ]*\d{4}',$file,$matches); 
0

使用i修改,使正則表達式不區分大小寫。這使得你的正則表達式更短一些,因爲你可以寫[a-z]而不是[A-Za-z]

您還可以用圓括號圍繞要提取出的每個部分,然後從$matches陣列檢索它們。

我的正則表達式還假設你所有的數字可能會有所不同的數字位數。因此,與DD類似,DDDD號碼可以是0-9,10-99,100-999或1000-9999。

preg_match_all('/([a-z]{2})[- ]*(\d{1,2})[- ]*([a-z])[- ]*([a-z]{2})?[- ]*(\d{1,4})/i',$file,$matches); 
$LL = $matches[1]; 
$DD = $matches[2]; 
//etc