2017-02-21 34 views
0

我有一些數據,我想找出它的價值,所以我嘗試preg_match函數它可以很容易地找到值我嘗試下面的代碼來獲取值,但我認爲有一些問題在我的代碼,因爲我得到$ a的值,但我想盡辦法找到的$ A1此處值爲m,示例代碼preg_match無法正常工作

$data=Date:29-05-2016 11:36 - Mo:919530489323 - pdd:9339 - lpm:78JIOP- 
pas:sami 
preg_match('#Date:(.*?) (.*?) - Mo:91(.*?) - pdd:(.*?) - 
lpm:(.*?) - pas:(.*?)#',$data,$matches); 
$a=$matches[3]; 
$a1=$matches[6]; 

現在我做什麼來獲得$ A1值或什麼是正確的代碼,它

+0

這意味着沒有匹配....'print_r'並參見 –

+0

提供可重複的代碼。在'pdd'和'lpm'之間,字符串中沒有新行。另外,我會寫一個比'。*?'更嚴格的正則表達式 – chris85

回答

1

將您的最後一個單詞替換爲regex以匹配整個單詞。目前它返回空白(如果你有print_r匹配數組)。

使用regex如下:

preg_match('#Date:(.*?) (.*?) - Mo:91(.*?) - pdd:(.*?) - lpm:(.*?) - pas:(.*)#',$data,$matches); 
1

自上次支架使用laziness mark帶通配符,除其他規則要求它,它將匹配什麼。沒有其他規則可以指定總體匹配的結束,所以最後一部分sami只是簡單地被正則表達式忽略。您可以檢查此:

<?php 

$data="Date:29-05-2016 11:36 - Mo:919530489323 - pdd:9339 - lpm:78JIOP - pas:sami"; 
preg_match('#Date:(.*?) (.*?) - Mo:91(.*?) - pdd:(.*?) - lpm:(.*?) - pas:(.*?)#',$data,$matches); 

var_dump($matches); 

其中輸出這樣的:

array(7) { 
    [0]=> 
    string(70) "Date:29-05-2016 11:36 - Mo:919530489323 - pdd:9339 - lpm:78JIOP - pas:" 
    [1]=> 
    string(10) "29-05-2016" 
    [2]=> 
    string(5) "11:36" 
    [3]=> 
    string(10) "9530489323" 
    [4]=> 
    string(4) "9339" 
    [5]=> 
    string(6) "78JIOP" 
    [6]=> 
    string(0) "" 
} 

注意整體匹配的字符串($matches[0])值實際上停在最後:。這就是爲什麼你在$matches[6]有一個空字符串。

Chainging正則表達式將會解決這個問題:

<?php 

$data="Date:29-05-2016 11:36 - Mo:919530489323 - pdd:9339 - lpm:78JIOP - pas:sami"; 
preg_match('#^Date:(.*?) (.*?) - Mo:91(.*?) - pdd:(.*?) - lpm:(.*?) - pas:(.*?)$#',$data,$matches);   

var_dump($matches); 

通知的^$我已經添加。它們將匹配「字符串的開始」和「字符串的結尾」。所以從最後的:到整個輸入字符串的末尾的字符串都會包含在內。其輸出如下:

array(7) { 
    [0]=> 
    string(74) "Date:29-05-2016 11:36 - Mo:919530489323 - pdd:9339 - lpm:78JIOP - pas:sami" 
    [1]=> 
    string(10) "29-05-2016" 
    [2]=> 
    string(5) "11:36" 
    [3]=> 
    string(10) "9530489323" 
    [4]=> 
    string(4) "9339" 
    [5]=> 
    string(6) "78JIOP" 
    [6]=> 
    string(4) "sami" 
}