2015-06-02 2 views
2

Мои данные -preg_match - Regular Expression Создание массива

{'/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}} 

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

Я хочу, чтобы массив всех данных Так что я считаю, что это должно выглядеть ценам ниже

array (
    [0] => array (
     [0] => '/Users/aaron/Box/cats.tex' 
     [1] => array (
        [total] =>'184' 
      ) 
    } 
} 

Моя попытка preg_match -

$subject = file_get_contents('/Users/aaron/.timetap/full.db'); 
$pattern = '{...}'; 
preg_match($pattern, substr($subject,3), $matches, PREG_OFFSET_CAPTURE); 

Что был бы шаблон для того, чтобы взять вышеуказанные данные и превратить их в массив в PHP? Есть ли функция PHP, которая может преобразовать ее в массив без использования preg_match?

ответ

3

Вы регулярное выражение не имеет смысла, так как у тебя есть это. Во-первых, вам не хватает разделителей. {, } и . - все специальные символы регулярных выражений, поэтому они должны быть экранированы. Это также похоже на структуру данных 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 
     ) 

) 

Ниже приведены ссылки на информацию о функциях/модификаторов, которые я использовал.

  1. http://php.net/manual/en/reference.pcre.pattern.modifiers.php
  2. http://php.net/manual/en/function.preg-replace-callback.php
  3. 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). Затем в последней строке мы присваиваем нашей глобальной переменной новое значение.

+0

мое регулярное выражение было полностью прекрасным - Bro. В любом случае, будучи средним - ваш результат не соответствует запросу. – Falt4rm

+0

Что @ Falt4rm ?! Я ничего не сказал о вашем регулярном выражении/ответе. Когда я ответил, ваш ответ не построил массив. – chris85

+0

Oh lol well mb подумал, что вы говорили о моем шаблоне - я думал, что его образ должен был заполнить пустой не настоящий. Мб тогда. Прошу прощения за это. – Falt4rm

1

я соответствовал оба целям, используя этот шаблон: /(\'.*?\'):\s?\{'.*?(\d{1,})\}/

Пояснения:

  • (\'.*?\') - Группа 1: Любое количество characteres МЕЖДУ полукокса ''»(ленивый)
  • :\s?\{'.*? - Далее следуют символы: и O или 1 espace и char '{' и любое количество символов (ленивый)
  • (\d{1,})\} - Группа 2: 1digits по крайней мере, и затем '}'

См Demo

<?php 
$array_input = 
    array(0 => "{'/Users/aaron/Applications/developer-vagrant/web/g.php': {'total': 22}}", 
      1 => "{'/Users/aaron/.vim/autoload/timetap.vim': {'total': 0}}"); 

$pattern = "/(?:(\'.*?\'):\s?\{'.*?(\d{1,})\})/"; 
$array_output = array(); 

for($i = 0; $i < count($array_input); ++$i) 
{ 
    preg_match($pattern, $array_input[$i], $output); 
    $array_output[$i][0] = $output[1]; 
    $array_output[$i][1] = array('total' => ($output[2])); 
} 

print "<pre>"; 
print_r($array_output); 
print "<pre>"; 
?> 

Ouput:

Array 
(
[0] => Array 
    (
     [0] => '/Users/aaron/Applications/developer-vagrant/web/g.php' 
     [1] => Array 
      (
       [total] => 22 
      ) 

    ) 

[1] => Array 
    (
     [0] => '/Users/aaron/.vim/autoload/timetap.vim' 
     [1] => Array 
      (
       [total] => 0 
      ) 

    ) 

) 
1

Похоже, что это уже в JSON, поэтому вы можете просто использовать json_decode(), чтобы превратить его в объекты. Все, что вам нужно сделать, чтобы сделать его совместимым с PHP json_decode(), превращает одиночные тики в двойные кавычки.

$string = "{'/Users/aaron/Applications/developer-vagrant/web/g.php': {'total': 22}}"; 
$string = str_replace("'", '"', $string); 
$object = json_decode($string); 
var_dump($object); 
/* 
Outputs the following: 
object(stdClass)#1 (1) { 
    ["/Users/aaron/Applications/developer-vagrant/web/g.php"]=> 
    object(stdClass)#2 (1) { 
    ["total"]=> 
    int(22) 
    } 
} 
*/