2010-04-26 6 views
1

Я использую регулярные выражения в php для сопоставления почтовых индексов, найденных в строке.php array регулярные выражения

Результаты возвращаются как массив, мне было интересно, если есть способ, чтобы назначить переменные для каждого из результатов, что-то вроде

$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

+0

Смарт для использования 'list()', но я думаю, что более сложная часть получает почтовые индексы в простой массив в первую очередь. $ matches - многомерный массив, и вам нужно выбрать нулевой элемент из каждого из его подматриц. – dreeves

ответ

2

Update: Для того, чтобы сделать этот пример работы, вы должны использовать 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] на самом деле не массив почтовых индексов! Вам нужно получить нулевой элемент каждого члена в $ match. – dreeves

+0

@dreeves: Вы правы, я думал, что OP использовал 'PREG_PATTERN_ORDER' в своем коде. На самом деле с помощью этого флага намного проще получить все почтовые индексы. –

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; 
} 
Смежные вопросы