自上次支架使用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"
}
這意味着沒有匹配....'print_r'並參見 –
提供可重複的代碼。在'pdd'和'lpm'之間,字符串中沒有新行。另外,我會寫一個比'。*?'更嚴格的正則表達式 – chris85