PHP正则表达式拆分序列化字符串

时间:2014-07-02 21:59:55

标签: php regex

我有一个格式的字符串:

$15?1?2/:1$16E/:2$17?6?7/:6$19E/:7$3E/

我想使用preg_split()将其分解为一个数组,但我似乎无法正确使用正则表达式。具体来说,我希望在每个$之后直接得到一个包含所有数值的数组。

所以在这种情况下:

[0] => 15
[1] => 16
[2] => 17
[3] => 19
[4] => 3 

如果有人可以向我解释正则表达式,那会产生惊人的效果。

3 个答案:

答案 0 :(得分:1)

拆分与全部匹配

分裂和匹配是同一枚硬币的两面。您甚至不需要拆分:这将返回您要查找的确切数组(请参阅PHP demo)。

$regex = '~\$\K\d+~';
$count = preg_match_all($regex, $yourstring, $matches);
print_r($matches[0]);

<强>输出

Array
(
    [0] => 15
    [1] => 16
    [2] => 17
    [3] => 19
    [4] => 3
)

<强>解释

  • \$$
  • 相匹配
  • \K告诉引擎放弃与其返回的最终匹配项目匹配的内容
  • \d+与您的数字匹配

坚持解释。 :)

答案 1 :(得分:0)

或者这个:

$preg = preg_match_all("/\$(\d+)/", $input, $output);
print_r($output[1]);

http://www.phpliveregex.com/p/5Rc

答案 2 :(得分:0)

这是非正则表达式示例:

$string = '$15?1?2/:1$16E/:2$17?6?7/:6$19E/:7$3E/';

$array = array_map( function( $item ) {
    return intval( $item );
}, array_filter( explode( '$', $string ) ) );

想法是通过$ character来爆炸字符串,并映射该数组并使用intval()来获取整数值。


以下是捕获分隔符的preg_split()示例:

$string = '$15?1?2/:1$16E/:2$17?6?7/:6$19E/:7$3';

$array = preg_split( '/(?<=\$)(\d+)(?=\D|$)/', $string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE );
/*
  (?<=\$)                  look behind to see if there is: '$'
  (                        group and capture to \1:
    \d+                      digits (0-9) (1 or more times (greedy))
  )                        end of \1
  (?=\D|$)                 look ahead to see if there is: non-digit (all but 0-9) OR the end of the string
*/

this帖子的帮助下,一种从结果数组中获取每一秒值的有趣方法。

$array = array_intersect_key( $array, array_flip( range( 1, count( $array ), 2 ) ) );