2010-04-26 57 views
1

我在php中使用正則表達式來匹配在字符串中找到的郵編。php數組正則表達式

結果被作爲數組返回,我想知道是否有任何方式的變量分配給每個結果的,像

$postcode1 = first match found 
$postcode2 = second match found 

這裏是我的代碼

$html = "some text here bt123ab and another postcode bt112cd"; 
preg_match_all("/([a-zA-Z]{2})([0-9]{2,3})([a-zA-Z]{2})/", $html, $matches, PREG_SET_ORDER); 

foreach ($matches as $val) { 
    echo $val[0]; } 

我對正則表達式和PHP非常陌生,如果這是一個愚蠢的問題,請原諒我。

在此先感謝

+0

所以你要分配一個數組變量的內容?如果是的話,你可以使用'list()'函數(http://ch2.php.net/list)。 – svens 2010-04-26 17:04:44

+0

聰明的使用'list()',但我認爲更棘手的部分是首先將郵編編碼到一個簡單的數組中。 $ matches是一個多維數組,您需要從每個子數組中選取第零個元素。 – dreeves 2010-04-26 17:29:07

回答

2

更新:爲了使這個例子工作,你必須使用PREG_PATTERN_ORDER而不是PREG_SET_ORDER(我想你用它在你的代碼,但很明顯,我讀得太快;)) :

PREG_PATTERN_ORDER
結果排序使得$matches[0]滿圖案匹配的數組$matches[1]是由匹配的字符串數組第一個加括號的子模式,等等。

如果你真的想,你可以將它們分配給變量:

$postcode1 = $matches[0][0]; 
$postcode2 = $matches[0][1]; 

但它容易,只需訪問數組元素海事組織。

或者更多的東西花哨:

for ($i = 0; $i < count($matches[0]); $i++) { 
     ${'postcode'.$i+1} = $matches[0][$i]; 
} 

但我只是做:

$postcodes = $matches[0]; 

,然後通過正常的數組訪問訪問郵政編碼。

+0

$ matches [0]實際上並不是郵編的數組!您需要獲取$ matches的每個成員的第零個元素。 – dreeves 2010-04-26 17:26:44

+0

@dreeves:你說得對,我認爲OP在他的代碼中使用了'PREG_PATTERN_ORDER'。實際上,使用此標誌可以更輕鬆地獲取所有郵政編碼。 – 2010-04-26 17:34:29

0

下應該PHP 5.3+工作:

$postcodearray = array_map(function($x) {return $x[0];}, $matches); 
list($postcode1, $postcode2) = $postcodearray; 

(當然也可以合併成一條線,如果你不關心郵政編碼本身的陣列) 要得到的數組郵編使用anonymous function。 對於list()結構,看到此相關的問題:Parallel array assignment in PHP

如果您沒有PHP 5.3+(如該匿名函數是混亂的),你可以定義一個函數「第一」,像這樣

function first($x) { return $x[0]; } 

然後拿到郵政編碼的陣列,像這樣:

array_map("first", $matches) 
0
foreach ($matches as $index => $val) { 
    $prefix ='postcode'.$index; 
    ${$prefix} = $val; 
}