我需要做这个正则表达式还是拆分?

时间:2015-01-26 13:20:16

标签: php regex split

我必须拆分这种字符串:

Other,CODSITE,Items::getCodCdeCli+Address::getNameAddress
Other,CODSITE,Items::getCodCdeCli
Items::getCode+Address::getName,CODSITE+Items::getSample,Items::getItemID
Other, CODSITE, CODSITE2

等。

进入:

array(
    array(
    0 => 'Other',
    1 => 'CODSITE',
    2 => array(
        'Items' => 'getCodCdeCli',
        'Address' => 'getNameAddress'
       )
    ),
//...
) 

如果我们有一个' +'我们需要附加两个数据。如果我们有' ::'我们需要将第一部分作为结果信息的关键。

为了开始这个解决方案,我试图将其拆分为逗号:

$re = "/([^,]+)/"; 
$str = "Other,CODSITE,Items::getCodCdeCli+Address::getNameAddress"; 

preg_match_all($re, $str, $matches);

现在这个正则表达式我有这个:

array (size=2)
  0 => 
    array (size=3)
      0 => string 'Other' (length=5)
      1 => string 'CODSITE' (length=7)
      2 => string 'Items::getCodCdeCli+Address::getNameAddress' (length=43)
  1 => 
    array (size=3)
      0 => string 'Other' (length=5)
      1 => string 'CODSITE' (length=7)
      2 => string 'Items::getCodCdeCli+Address::getNameAddress' (length=43)

这是错的,我有两次相同的结果..和第2行=> [...]不分裂(我的正则表达式是正常的)

如果有人可以提供帮助! :)

3 个答案:

答案 0 :(得分:1)

单次传递的一种方法是使用array_combine function,如下所示:

$str = 'Other,CODSITE,Items::getCodCdeCli+Address::getNameAddress';
if ( preg_match_all('~(?|[,+]([^,+]+)::([^,+]+)|([^,]+))~', $str, $m) )
   print_r( array_combine ( $m[1], $m[2] ) );

输出:

Array
(
    [Other] =>
    [CODSITE] =>
    [Items] => getCodCdeCli
    [Address] => getNameAddress
)

答案 1 :(得分:1)

是否需要正则表达式?有可能通过几个explodeforeach循环实现此目的:

$str = 'Other,CODSITE,Items::getCodCdeCli+Address::getNameAddress';

//new entry per comma (,)
$results = explode(',',$str);

//check each entry for array information
foreach($results as &$result) {
    if(strpos($result,'+') !== FALSE) {

        //explode array information
        $bits1 = explode('+',$result);
        $result = array();
        foreach($bits1 as &$subresult) {

            //format array information into key => value pairs
            if(strpos($subresult,'::') !== FALSE) {
                $bits = explode('::',$subresult);
                $result[$bits[0]] = $bits[1];
            }
        }
    }
}
var_dump($results);

/**
 * array (size=3)
 *   0 => string 'Other' (length=5)
 *   1 => string 'CODSITE' (length=7)
 *   2 => array (size=2)
 *       'Items' => string 'getCodCdeCli' (length=12)
 *       'Address' => string 'getNameAddress' (length=14)
 */

答案 2 :(得分:1)

在@Richard Parnaby-King的帮助下回答。这是解决方案,事实上即使我确定我们可以将它用于相同的结果,也不需要正则表达式。

$lines = array(
    0 => 'Other,CODSITE,Items::getCodCdeCli+Address::getNameAddress',
    2 => 'Other,CODSITE,Items::getCodCdeCli',
    3 => 'Items::getCode+Address::getName,CODSITE+Items::getSample,Items::getItemID',
    4 => 'Other, CODSITE, CODSITE2',
);

foreach ($lines as $input) {
    $informations = explode(',', $input);
    $result = array();
    foreach ($informations as $information) {
        if(strpos($information, '+') !== FALSE) {
            $classes = explode('+',$information);
            $temp = array();
            foreach($classes as $subresult) {
                if(strpos($subresult,'::') !== FALSE) {
                    $classAndMethod = explode('::',$subresult);
                    $temp[$classAndMethod[0]] = $classAndMethod[1];
                } else {
                    $temp[] = trim($subresult);
                }
            }
            $result[] = $temp;
        } elseif (strpos($information, '::') !== FALSE) {
            $classAndMethod = explode('::',$information);
            $result[][$classAndMethod[0]] = $classAndMethod[1];
        } else {
            $result[] = trim($information);
        }
    }
    var_dump($result);
}

有效!