爆炸一个字符串

时间:2017-07-26 13:52:29

标签: php

我有一个字符串如下:

      $str = "am_customers.customer_key,am_customers.add_dt,CONCAT(am_customers.first_name,'',am_customers.last_name) as 
             name,am_customers.cell_phone,am_customers.crm_phase_key,  am_customers.source,am_customers.location_key,am_customers.hub_key,
             am_customers.crm_priority,am_customers.update_dt";

我想用逗号开出一个字符串。但问题是使用开括号和近括号,当我尝试用逗号来加载字符串时,我会得到如下结果

          Array
         (
           [0] => am_customers.customer_key
           [1] => am_customers.add_dt
           [2] => CONCAT(am_customers.first_name
           [3] => ''
           [4] => am_customers.last_name) as name
           [5] => am_customers.cell_phone
           [6] => am_customers.crm_phase_key
           [7] => am_customers.source
           [8] => am_customers.location_key
           [9] => am_customers.hub_key
           [10] => am_customers.crm_priority
           [11] => am_customers.update_dt
         )

但我希望结果如下:

       Array
     (
       [0] => am_customers.customer_key
       [1] => am_customers.add_dt
       [2] => CONCAT(am_customers.first_name,'',am_customers.last_name) as name
       [3] => am_customers.last_name) as name
       [4] => am_customers.cell_phone
       [5] => am_customers.crm_phase_key
       [6] => am_customers.source
       [7] => am_customers.location_key
       [8] => am_customers.hub_key
       [9] => am_customers.crm_priority
       [10] => am_customers.update_dt
     )

有没有办法按照我的要求做到这一点?

谢谢。

1 个答案:

答案 0 :(得分:1)

受到@Devon评论的启发,您可以使用preg_match_all

来实现这一目标

preg_match_all( '/[^C\(,]*(?:(?:Cf\.|C(?!f)|\([^)]*\))[^C\(,]*)*/', $str, $matches );

正则表达源:http://www.perlmonks.org/?node_id=907316

我刚刚测试了这段代码,它似乎可以满足您的要求:

$str = "am_customers.customer_key,am_customers.add_dt,CONCAT(am_customers.first_name,'',am_customers.last_name) as 
             name,am_customers.cell_phone,am_customers.crm_phase_key,  am_customers.source,am_customers.location_key,am_customers.hub_key,
             am_customers.crm_priority,am_customers.update_dt";

$matches = [];
preg_match_all( '/[^C\(,]*(?:(?:Cf\.|C(?!f)|\([^)]*\))[^C\(,]*)*/', $str, $matches );

/*
* Trims each match, removes empty string matches, and resets array keys.
*
* Source: http://php.net/manual/en/function.array-filter.php#111091
*/
$clean = array_map( 'trim', $matches[0] );
$clean = array_filter( $clean, 'strlen' );
$clean = array_values( $clean );

var_dump( $clean );

<强>文档

array_filterhttp://php.net/array_filter

array_maphttp://php.net/array_map

array_valueshttp://php.net/array_values

preg_match_allhttp://php.net/preg_match_all