2015-10-13 58 views
1

我想創建一個簡單的PHP腳本,從字符串中檢索信息並將其放入數組中。我環視了一些網站在多捕獲正則表達式爲一個模式,但似乎無法得到輸出即時尋找PHP正則表達式匹配得到意想不到的輸出

目前這是我的腳本。

$input = "username: jack number: 20"; 
//$input = file_get_contents("test.txt"); 

preg_match_all("/username: ([^\s]+)|number: ([^\s]+)/", $input, $data); 

var_dump($data); 

將會產生以下輸出:

0 => 
    array (size=2) 
     0 => string 'username: jack' (length=14) 
     1 => string 'number: 20' (length=10) 
    1 => 
    array (size=2) 
     0 => string 'jack' (length=4) 
     1 => string '' (length=0) 
    2 => 
    array (size=2) 
     0 => string '' (length=0) 
     1 => string '20' (length=2) 

進出口尋找到的數據進入的形式:

0 => 
    array (size=x) 
    0 => string 'jack' 
1 => 
    array (size=x) 
    0 => string '20' 

或兩個不同的陣列,其中所述鍵對應於相同的用戶/ number combo

回答

2

您可以使用匹配,復位\K

preg_match_all('/\b(?:username|number):\h*\K\S+/', $input, $data); 

print_r($data[0]); 
Array 
(
    [0] => jack 
    [1] => 20 
) 

正則表達式破碎:

\b     => a word boundary 
(?:username|number) => matches username or number. (?:..) is non-capturing group 
:\h*     => matches a colon followed optional horizontal spaces 
\K     => match reset, causes regex engine to forget matched data 
\S+     => match 1 or more non-space chars 

否則,您可以使用一個捕獲組,讓您的匹配這樣的數據:

preg_match_all('/\b(?:username|number):\h*(\S+)/', $input, $data); 

print_r($data[1]); 
Array 
(
    [0] => jack 
    [1] => 20 
) 
+0

如果你描述OP是什麼'RegEx'正在做什麼,我的意思是將它拆分爲'/'開始表達式 – Mubin

+0

現在回答是。 – anubhava

+1

這太棒了:) – Mubin