php数组正则表达式

时间:2010-04-26 17:00:06

标签: php regex arrays

我在php中使用正则表达式来匹配字符串中的postcodes。

结果以数组形式返回,我想知道是否有任何方法可以为每个结果分配变量,例如

$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很新,如果这是一个愚蠢的问题,请原谅我。

提前致谢

3 个答案:

答案 0 :(得分:2)

更新:为了使此示例有效,您必须使用PREG_PATTERN_ORDER而不是PREG_SET_ORDER(我认为您在代码中使用了它,但显然我读过太快;)):

  

PREG_PATTERN_ORDER
  对结果进行排序,以便$matches[0]完整模式匹配的数组,$matches[1]是由第一个带括号的子模式匹配的字符串数组,依此类推。

如果您真的想要,可以将它们分配给变量:

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

但是更容易访问数组元素imo。

或者更奇特的东西:

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

但我会这样做:

$postcodes = $matches[0];

然后通过正常的数组访问访问邮政编码。

答案 1 :(得分: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)

答案 2 :(得分:0)

foreach ($matches as $index => $val) {
    $prefix ='postcode'.$index;
    ${$prefix} = $val;
}