我试图在PHP中使用正则表达式来解析字符串并创建一个数组。这是我的尝试:
function parseItemName($itemname) {
// Given item name like "2 of #222001." or "3 of #222001; 5 of #222002."
// Return array like (222001 => 2) or (222001 => 3, 222002 => 5)
preg_match('/([0-9]?) of #([0-9]?)(.|;\s)/', $itemname, $matches);
return $matches;
}
使用
调用该函数print_r(parseItemName("3 of #222001; 5 of #222002."));
返回
Array ( [0] => 3 of #22 [1] => 3 [2] => 2 [3] => 2 )
有谁知道如何使这项工作?我假设preg_match()不是最好的方法,但我不确定还有什么可以尝试。我很欣赏任何想法。谢谢!
答案 0 :(得分:2)
除了对正则表达式模式进行调整之外,您还希望在设置preg_match_all
标志的情况下使用PREG_SET_ORDER
以使事情更简单。
这将返回如此排列的$matches
数组:
array
0 =>
array
0 => string '3 of #222001' (length=12)
1 => string '3' (length=1)
2 => string '222001' (length=6)
1 =>
array
0 => string '5 of #222002' (length=12)
1 => string '5' (length=1)
2 => string '222002' (length=6)
下面的示例函数现在循环遍历所有匹配,并构造一个新数组,使用第二个匹配作为键,第一个匹配作为值。
function parseItemName($itemname) {
// Given item name like "2 of #222001." or "3 of #222001; 5 of #222002."
// Return array like (222001 => 2) or (222001 => 3, 222002 => 5)
preg_match_all('/(\d+)\sof\s#(\d+)/', $itemname, $matches, PREG_SET_ORDER);
$newArray = array();
foreach($matches as $match) {
$newArray[$match[2]] = intval($match[1]);
}
return $newArray;
}
var_dump(parseItemName("3 of #222001; 5 of #222002."));
转储的输出如下所示:
array
222001 => int 3
222002 => int 5
答案 1 :(得分:1)
([0-9]?)
^--- "0 or 1 of ...
您想要的是+
,而不是“1或更多”,并且会捕获所有数字,而不仅仅是第一个数字。
答案 2 :(得分:0)
使用类似:
/(\d*?)\sof\s#(\d*)\b/
编辑:删除此帖中评论的延迟匹配。
答案 3 :(得分:0)
function parseItemName( $itemname ) {
preg_match_all( '/([0-9]+) of #([0-9]+)/', $itemname, $matches, PREG_SET_ORDER );
$items = array();
foreach ( $matches as $match ) {
$items[ $match[2] ] = $match[1];
}
// foreach
return $items;
}
// parseItemName