php preg_split условно разделить строку - PullRequest
0 голосов
/ 15 декабря 2010

Мне нужно разделить следующее

$str = 'min(5,6,7,88),email'

$str= 'min(5,6,7,88),!email,max(6,5),alpha_numeric,required'//other possibilities

и возвращает массив примерно так:

array(
  [0]=>array(
     [0]=>'min',
     [1]=>array(5,6,7,88)
  )
  [1]=>array(
     [0]=>'email'
  )
)

это возможно? кстати email и min могут быть чем угодно, а также 5 6 7 88

Ответы [ 3 ]

0 голосов
/ 15 декабря 2010

Учитывая следующее:

$test = "min(5,6,7,88),email";
$_ = null;
if (preg_match('/^(?<first>\w+)\((?<array>(?:[0-9]+\x2C*)+)\)\x2C(?<last>\w+)$/',$test,$_))
{
  $result = Array(
    Array($_['first'],explode(',',$_['array'])),
    Array($_['last'])
  );
  print_r($result);
}

Отображает следующий результат:

Array
(
    [0] => Array
        (
            [0] => min
            [1] => Array
                (
                    [0] => 5
                    [1] => 6
                    [2] => 7
                    [3] => 88
                )

        )

    [1] => Array
        (
            [0] => email
        )

)

0 голосов
/ 15 декабря 2010
<code>function parse($str) {
    $str = str_replace(array('(',')'),"0x00",$str);
    $strArray = explode("0x00",$str);
    $tokens = array();
    $tokenRef = 0;
    foreach($strArray as $tokenID => $tokenValue) {
        if (($tokenID % 2) == 1) {
            --$tokenRef;
            $tokens[$tokenRef++][1] = '('.$tokenValue.')';
        } else {
            $tokenList = explode(",",$tokenValue);
            foreach($tokenList as $token) {
                if ($token != '') {
                    $tokens[$tokenRef++][0] = $token;
                }
            }
        }
    }
    return $tokens;
}

$str = 'min(5,6,7,88),email';

$split = parse($str);

echo '<pre>';
var_dump($split);
echo '
'; echo '
'; $ str = 'min (5,6,7,88),! email, max (6,5), буквенно-цифровой, обязательный'; $ split = parse ($ str); echo '
';
var_dump($split);
echo '
'; echo '
';

Придает

array(2) {
  [0]=>
  array(2) {
    [0]=>
    string(3) "min"
    [1]=>
    string(10) "(5,6,7,88)"
  }
  [1]=>
  array(1) {
    [0]=>
    string(5) "email"
  }
}

и

array(5) {
  [0]=>
  array(2) {
    [0]=>
    string(3) "min"
    [1]=>
    string(10) "(5,6,7,88)"
  }
  [1]=>
  array(1) {
    [0]=>
    string(6) "!email"
  }
  [2]=>
  array(2) {
    [0]=>
    string(3) "max"
    [1]=>
    string(5) "(6,5)"
  }
  [3]=>
  array(1) {
    [0]=>
    string(13) "alpha_numeric"
  }
  [4]=>
  array(1) {
    [0]=>
    string(8) "required"
  }
}
0 голосов
/ 15 декабря 2010

Я думаю, preg_match лучше всего подходит для этого конкретного случая. Однако одно только preg_match не может отформатировать вывод, как вы хотите.

preg_match('/(\w+)\(([0-9,]+)\),(\w+)+/', $str, $values);
$output = array(
   array($values[1], explode(',', $values[2])),
   array($values[3]),
);
...