2010-04-26 9 views
1

J'utilise des expressions régulières dans php pour faire correspondre des codes postaux trouvés dans une chaîne.expressions régulières php array

Les résultats sont retournés comme un tableau, je me demandais s'il y a un moyen d'assigner des variables à chacun des résultats, quelque chose comme

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

ici est mon code

$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]; } 

Je suis très nouveau pour les expressions régulières et PHP, pardonnez-moi si c'est une question stupide.

Merci à l'avance

+0

vous voulez affecter le contenu d'un tableau à des variables? Si oui, vous pouvez utiliser la fonction 'list()' (http://ch2.php.net/list). – svens

+0

Smart pour utiliser 'list()' mais je pense que la partie la plus délicate consiste à obtenir les codes postaux dans un tableau simple en premier lieu. $ matches est un tableau multidimensionnel et vous devez choisir l'élément zeroth de chacun de ses sous-tableaux. – dreeves

Répondre

2

Mise à jour: Pour faire ce travail par exemple, vous devez utiliser PREG_PATTERN_ORDER au lieu de PREG_SET_ORDER (je pensais que vous l'avez utilisé dans votre code, mais il est évident que je lis trop vite;)) :

PREG_PATTERN_ORDER
Ordres résultats afin que $matches[0] est un tableau de modèle complet correspond, $matches[1] est un tableau de chaînes abondés par l' premier sous-masque entre parenthèses, et ainsi de suite.

Si vous voulez vraiment, vous pouvez les assigner à des variables:

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

Mais il est plus facile d'accès que les éléments du tableau imo.

Ou quelque chose de plus de fantaisie:

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

Mais je voudrais juste faire:

$postcodes = $matches[0]; 

et accéder aux codes postaux via un accès réseau normal.

+0

$ matches [0] n'est cependant pas le tableau des codes postaux! Vous devez obtenir l'élément zéro de chaque membre de $ matches. – dreeves

+0

@dreeves: Vous avez raison, je pensais que l'OP utilisait 'PREG_PATTERN_ORDER' dans son code. En fait, avec ce drapeau, il est beaucoup plus facile d'obtenir tous les codes postaux. –

0

Les éléments suivants doivent travailler pour PHP 5.3+:

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

(. Ce qui bien sûr peut être combiné en une seule ligne si vous ne se soucient pas de la gamme de codes postaux lui-même) obtenir le tableau de les codes postaux utilisent un anonymous function. Pour la construction list(), voir cette question connexe: Parallel array assignment in PHP

Si vous n'avez pas PHP 5.3+ (ou si cette fonction anonyme est source de confusion), vous pouvez définir une fonction « d'abord » comme si

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

puis obtenir le tableau de codes postaux comme ceci:

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