2012-10-17 60 views
1

我有兩個preg_match()調用,我想合併數組而不是替換第一個數組。到目前爲止我的代碼:如何將preg_match的輸出附加到現有數組?

$arr = Array(); 
$string1 = "Article: graphics card"; 
$string2 = "Price: 300 Euro"; 
$regex1 = "/Article[\:] (?P<article>.*)/"; 
$regex2 = "/Price[\:] (?P<price>[0-9]+) Euro/"; 

preg_match($regex1, $string1, $arr); 
//output here: 
$arr['article'] = "graphics card" 
$arr['price'] = null 
preg_match($regex2, $string2, $arr); 
//output here: 
$arr['article'] = null 
$arr['price'] = "300" 

我怎麼可能匹配,所以我的結果應該是:

$arr['article'] = "graphics card" 
$arr['price'] = "300" 

+0

您可以合併兩個正則表達式的匹配邏輯,然後preg_match串聯版本的字符串。 – JamesSwift

+0

介意使用'$ cache = array();'? – Passerby

+0

我不想要一個緩存 – Paedow

回答

1

您可以使用preg_replace_callback並處理回調函數內部的合併。

-1

這應該爲你工作,例如:

array_merge(// selfexplanatory 
      array_filter(preg_match($regex1, $string1, $arr)?$arr:array()), //removes null values 
      array_filter(preg_match($regex2, $string2, $arr)?$arr:array()) 
); 
+0

'preg_match()'返回整數(或者錯誤時爲'FALSE'),所以'array_filter()'不起作用。 – Passerby

0

您可以使用array_merge爲這個,如果你存儲在兩個不同的陣列結果。 但上面描述的輸出不正確。如果您在字符串中搜索正則表達式1,但只搜索$ arr ['article'],則沒有$ arr ['price']。同樣適用於第二個preg_match。 這意味着如果您將一個結果存儲在$ arr中,並將一個結果存儲在$ arr2中,則可以將它們合併到一個數組中。

preg_match本身不提供此功能。

0
  1. 使用不同陣列,用於第二的preg_match,說$arr2
  2. 導線$arr2$key => $value
  3. $arr[$key]$arr2[$key]中選擇非空值,並將該值寫入$arr[$key]
  4. $arr將要求合併數組。
1

如果是我這是我會怎麼做,這將允許在以後的日子更容易的擴展,並且會避免使用回調函數。它也可以支持通過用單個字符串var替換$strs[$key]$strs數組輕鬆搜索一個字符串。它不會刪除數字鍵,但如果您只是繼續訪問數組中的關聯鍵,則永遠不會導致問題。

$strs = array(); 
$strs[] = "Article: graphics card"; 
$strs[] = "Price: 300 Euro"; 

$regs = array(); 
$regs[] = "/Article[\:] (?P<article>.*)/"; 
$regs[] = "/Price[\:] (?P<price>[0-9]+) Euro/"; 

$a = array(); 

foreach($regs as $key => $reg){ 
    if (preg_match($reg, $strs[$key], $b)) { 
    $a += $b; 
    } 
} 

print_r($a); 

/* 
Array 
(
    [0] => Article: graphics card 
    [article] => graphics card 
    [1] => graphics card 
    [price] => 300 
) 
*/ 
相關問題