我在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很新,如果这是一个愚蠢的问题,请原谅我。
提前致谢
答案 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;
}