Разбор PHP-строки в массив - PullRequest
0 голосов
/ 11 марта 2011

У меня есть строка, похожая на:

'- 10 TEST (FOO 3 TEST.BAR 213 BAZ (\HELLO) TEST'

Тот же формат для любой другой строки. Как я мог получить, значения FOO, BAR и BAZ. Так, например, я могу получить массив как:

'FOO' => 3,
'BAR' => 213,
'BAZ' => HELLO

Ответы [ 3 ]

3 голосов
/ 11 марта 2011

preg_match ваш друг:)

1 голос
/ 11 марта 2011

Вы хотите использовать preg_match, чтобы сначала получить совпадения, а затем поместить их в массив.Это даст вам то, что вы ищете:

$str = '- 10 TEST (FOO 3 TEST.BAR 213 BAZ (\HELLO) TEST';

preg_match('/FOO (\d+).+BAR (\d+).+BAZ \(\\\\(\w+)\)/i', $str, $match);

$array = array(
    'FOO' => $match[1],
    'BAR' => $match[2],
    'BAZ' => $match[3]
);

print_r($array);

Предполагается, что первые два значения являются числами, а последнее - символами слова.

0 голосов
/ 11 марта 2011

Предполагая, что ни константы, ни значения не содержат пробелов, это будет работать для данного примера:

$str = '(CONST1 value1 X.CONST2 value2 CONST3 (\VALUE3) X...)';
preg_match('/\((\S+)\s+(\S+)\s+.*?\.(\S+)\s+(\S+)\s+(\S+)\s+\(\\\\(\S+)\)/', $str, $m);
$arr = array();
for($i=1; $i<count($m);$i+=2) {
  $arr[$m[$i]] = $m[$i+1];
}
print_r($arr);

output:

Array
(
    [CONST1] => value1
    [CONST2] => value2
    [CONST3] => VALUE3
)

объяснение

\(          : an open parenthesis
(\S+)       : 1rst group, CONST1, all chars that are not spaces
\s+         : 1 or more spaces
(\S+)       : 2nd group, value1
\s+.*?\.    : some spaces plus any chars plus a dot
(\S+)       : 3rd group, CONST2
\s+         : 1 or more spaces
(\S+)       : 4th group, value2
\s+         : 1 or more spaces
(\S+)       : 5th group, CONST3
\s+         : 1 or more spaces
\(          : an open parenthesis
\\\\        : backslash
(\S+)       : 6th group, VALUE3
\)          : a closing parenthesis
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...