Вы регулярное выражение не имеет смысла, так как у тебя есть это. Во-первых, вам не хватает разделителей. {
, }
и .
- все специальные символы регулярных выражений, поэтому они должны быть экранированы. Это также похоже на структуру данных JSON, поэтому функции JSON могут вам пригодиться. Если вы все еще хотите перейти на REGEX, то я сделаю это, полагая, что ваша структура данных согласована.
<?php
$string = "{'/Users/aaron/Applications/developer-vagrant/web/g.php': {'total': 22}}
{'/Users/aaron/.vim/autoload/timetap.vim': {'total': 0}}
{'/Users/aaron/.vimrc': {'total': 5}}
{'/Users/aaron/Documents/Programming/PHP/TimeTapCLI/composer.json': {'total': 144}}
{'/Users/aaron/Documents/Programming/PHP/TimeTapCLI/timetap.php': {'total': 351}}
{'/Users/aaron/Box/linux/.vim/autoload/timetap.vim': {'total': 37}}
{'/Users/aaron/Box/cats.tex': {'total': 184}}";
$pattern = '~^\{(.*)\}$~m';
$data[] = preg_replace_callback($pattern, function($matches) {
global $output_data;
preg_match("~'(.*?)'\s*:\s*\{'(.*?)'\s*:\s*(\d+)\}~", $matches[1], $output);
$output_data[$output[1]] = array($output[2] => $output[3]);
}, $string);
print_r($output_data);
Выход:
Array
(
[/Users/aaron/Applications/developer-vagrant/web/g.php] => Array
(
[total] => 22
)
[/Users/aaron/.vim/autoload/timetap.vim] => Array
(
[total] => 0
)
[/Users/aaron/.vimrc] => Array
(
[total] => 5
)
[/Users/aaron/Documents/Programming/PHP/TimeTapCLI/composer.json] => Array
(
[total] => 144
)
[/Users/aaron/Documents/Programming/PHP/TimeTapCLI/timetap.php] => Array
(
[total] => 351
)
[/Users/aaron/Box/linux/.vim/autoload/timetap.vim] => Array
(
[total] => 37
)
[/Users/aaron/Box/cats.tex] => Array
(
[total] => 184
)
)
Ниже приведены ссылки на информацию о функциях/модификаторов, которые я использовал.
- http://php.net/manual/en/reference.pcre.pattern.modifiers.php
- http://php.net/manual/en/function.preg-replace-callback.php
- http://php.net/manual/en/function.preg-match.php
Я сделаю запись до деталей, используемых здесь немного. Если у вас есть особые вопросы, напишите.
Объяснение того, что происходит ...
~
являются разделителями, которые сообщают движку регулярных выражений, где выражение начинается с концов. Внешний вид m
- это модификатор, который сообщает ему обрабатывать каждую строку как строку. ^
и $
указывают, что они соответствуют началу и концу строки, в этом случае каждая строка из-за модификатора m
. \
перед {
состоит в том, чтобы избежать фигурной скобки, которая имеет специальный контекст в регулярном выражении. .
- любой символ, а *
- квантификатор, означающий ноль или более случаев. Когда они соединены вместе, это означает, что ноль или более любых символов. ()
вокруг этого - группа захвата, в которой хранится то, что находится внутри нее, и \}
- так мы останавливаем последнюю фигурную фигуру. Итак, с {'/Users/aaron/Applications/developer-vagrant/web/g.php': {'total': 22}}
мы закончили с '/Users/aaron/Applications/developer-vagrant/web/g.php': {'total': 22}
. Мы передаем это в функцию, потому что мы хотим отфильтровать это дальше. Мы используем global
здесь, потому что мы находимся внутри этой анонимной функции и хотим, чтобы она была доступна, когда мы закончили. '(.*?)'
ищет все, что существует между одинарными кавычками. Это известно как ленивый/не жадный, ?
заставляет его останавливаться при первом появлении следующего символа (одинарная кавычка). \s*
- любое количество пробелов. Остальная часть регулярного выражения здесь должна быть дешифрована из предыдущих описаний. $matches[1]
состоит в том, что мы хотим сначала сгруппировать значение из preg_replace_callback
$matches[0]
- это все, что было найдено (то же самое с preg_match
). Затем в последней строке мы присваиваем нашей глобальной переменной новое значение.
мое регулярное выражение было полностью прекрасным - Bro. В любом случае, будучи средним - ваш результат не соответствует запросу. – Falt4rm
Что @ Falt4rm ?! Я ничего не сказал о вашем регулярном выражении/ответе. Когда я ответил, ваш ответ не построил массив. – chris85
Oh lol well mb подумал, что вы говорили о моем шаблоне - я думал, что его образ должен был заполнить пустой не настоящий. Мб тогда. Прошу прощения за это. – Falt4rm