php自定义字符串到正则表达式的数组

时间:2012-01-23 16:21:52

标签: php regex

我试图在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()不是最好的方法,但我不确定还有什么可以尝试。我很欣赏任何想法。谢谢!

4 个答案:

答案 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