2013-05-01 4 views
3

мне нужно, чтобы захватить некоторые строковые массивы .. и я пытался, но я не могу: $PHP регулярное выражение preg_match_all: Захват текста между несколькими квадратными скобками

я это в моем коде:

<?php 
$feed = "[['2013/04/03',8.300],['2013/04/04',8.320],['2013/04/05',8.400]]"; 
preg_match_all("/\[(.*?)\]/",$feed,$matches); 
print_r($matches); 

и возвращается:

Array 
(
    [0] => Array 
     (
      [0] => [['2013/04/03',8.300] 
      [1] => ['2013/04/04',8.320] 
      [2] => ['2013/04/05',8.400] 
     ) 

    [1] => Array 
     (
      [0] => ['2013/04/03',8.300 
      [1] => '2013/04/04',8.320 
      [2] => '2013/04/05',8.400 
     ) 

) 

, как я могу сделать с preg_match_all или preg_split .. или любой другой метод необходим, чтобы вернуть один массив элементов, таких как $ матчей [1] [1] или $ матчей [ 1] [2] ??

я имею в виду формат каждого элемента должен быть:

'2013/04/05',8.400 

надежда ясно :)

и заранее спасибо !!

+1

Возможно, я ошибаюсь, но пример выглядит как действительный массив JSON. Разве не было бы намного проще сделать 'json_decode', а затем просто использовать его как обычный массив? – pilsetnieks

+0

Вы можете использовать '(? <=^\ [|,) \ [(. *?) \]'. – HamZa

+0

или сделать ваше регулярное выражение более конкретным '\ [('\ d {4} \/\ d {2} \/\ d {2}', \ d + (?: \. \ D +)?) \]' – HamZa

ответ

1

Этот текст, как представляется, в достаточно нормализованной формате, ала JSON. Вполне возможно избежать совпадения с реестром и проанализировать его с помощью json_decode, хотя некоторые незначительные преобразования должны быть сделаны.

// original input 
$text = "[['2013/04/03',8.300],['2013/04/04',8.320],['2013/04/05',8.400]]"; 

// standard transformation to correct ' and/characters 
$text = str_replace(array('/', "'"), array('\/', '"'), $text); 

// let native PHP take care of understanding the data 
$data = json_decode($text); 

Это дает вам массив массивов, содержащий ваши даты и значения. print_r($data); дает:

Array (
    [0] => Array (
     [0] => 2013/04/03 
     [1] => 8.3 
    ) 
    [1] => Array (
     [0] => 2013/04/04 
     [1] => 8.32 
    ) 
    [2] => Array (
     [0] => 2013/04/05 
     [1] => 8.4 
    ) 
) 

Преобразования заменяют / в \/ и ' к ", чтобы сделать строку JSON-совместимой. Или что-то в этом роде.

0

Вы можете попробовать это:

<?php 
$feed = "[['2013/04/03',8.300],['2013/04/04',8.320],['2013/04/05',8.400]]"; 
preg_match_all('~\[\K[^[\]]++~', $feed, $matches); 
print_r($matches); 
+0

Ваше решение имеет открывающий кронштейн в первом матче. [0] => ['2013/04/03', 8.300 – pp19dd

+0

это в значительной степени то, что мне нужно ... только первый элемент имеет [квадратную скобку .., но, возможно, я смогу очистить это при зацикливании ... но возможно убери это? – lizaaard

+0

@ lizaaard: Я забыл открытую квадратную скобку в классе. Это исправлено. –

0

Если бы это было не действительный json, вы могли бы сделать простые манипуляции со строками.

$arr = explode("],[", trim($str, " []")); 

Выходной будет массив с элементами, похожими на это: "'2013/04/03',8.300" , "'2013/04/04',8.320"

Это будет работать раз быстрее, чем подход с использованием RegExp методов.

+0

Я удивляюсь, почему он появился как «Горячие сетевые вопросы» сейчас, в 2017 году. Lol –

Смежные вопросы