如何从带有大括号的字符串中提取数字?

时间:2011-02-23 18:34:52

标签: php regex

我有一个测试字符串,如下所示:

digit{digit}digit

我想将这个字符串分成3个变量。例如,40{1}2应分为40 1 2.字符串可以与2034{345}1245一样大。我认为正则表达式是分割这个字符串的最佳方法。

这是我到目前为止所拥有的:

$productID = preg_match('/(.*?){/', $product);
$productOptionID = preg_match('/{(.*?)}/', $product);
$optionValueID = preg_match('/}(.*?)/', $product);

4 个答案:

答案 0 :(得分:5)

此处不需要正则表达式:

$str = '40{1}2';

sscanf($str, '%d{%d}%d', $part_1, $part_2, $part_3);
// $part_1 would equal: 40
// $part_2 would equal: 1
// $part_3 would equal: 2

使用此方法,变量已经转换为整数。

答案 1 :(得分:1)

请改为尝试:

preg_match('/^(\d+)\{(\d+)\}(\d+)$/', '123{456}789', $matches)
$productId = $matches[1];
$productOptionId = $matches[2];
$productValueId = $matches[3];

答案 2 :(得分:1)

preg_split

怎么样?
$str = '123{456}789';
$arr = preg_split("/[{}]/", $str);
print_r($arr);

<强>输出:

Array
(
    [0] => 123
    [1] => 456
    [2] => 789
)

答案 3 :(得分:0)

我个人会创建一个简单的函数来管理从字符串中获取数据的过程,如下所示:

function processID($string)
{
    $result = array();
    $c = 0;
    for($i = 0; $i < strlen($string); $i++)
    {
         if(!isset($result[$c]))
         {
             $result[$c] = "";
         }

         if($string[$i] == "{" || $string[$i] == "}")
         {
             $c++;
             continue;
         }

         $result[$c] .= $string[$i];
    }
    return $result;
}

然后只需使用:

$result = processID("2034{345}1245");

输出结果如下:

array(3) {
  [0]=>
  string(4) "2034"
  [1]=>
  string(3) "345"
  [2]=>
  string(4) "1245"
}

可以在这里找到一个工作示例:http://codepad.org/7k5tAzuy