2015-08-17 3 views
-1

У меня есть этот массив:Использование preg_replace, чтобы добавить кавычки в массив

$array = '[[Smarties, 50g, 3, 1.99], 
      [M&Ms Peanut, 49g, 3, 1.99], 
      [Oreo Cookies, 300g, 1, 3.99], 
      [Pepsi, 355ml, 3, 1.29]]'; 

мне нужно использовать json_decode, так что мне нужно найти способ, чтобы окружать информацию внутри в кавычках, как это:

[["Smarties", "50g", "3", "1.99"], 
["M&Ms Peanut", "49g", "3", "1"."99"], 
["Oreo Cookies", "300g", "1", "3.99"], 
["Pepsi", "355ml", "3", "1.29"]] 

Я попытался с помощью preg_replace, и это то, что я в настоящее время получаю (близко, но это разделение цен на две, а также разделяя имена двух слов на два.):

[["Smarties", "50g", "3", "1"."99"], 
["M"&"Ms" "Peanut", "49g", "3", "1"."99"], 
["Oreo" "Cookies", "300g", "1", "3"."99"], 
["Pepsi", "355ml", "3", "1"."29"]] 

Мне очень трудно понять preg_replace, и я надеюсь, что кто-то сможет помочь.

Есть ли способ использовать разделительные запятые в качестве направляющих, чтобы определить, где положить кавычки?

+0

Вы можете использовать [lookaround assertions] (http://www.regular-expressions.info/lookaround.html), такие как '(? <= \ [)' Или '(?! \ S * \()' Хотя может быть проще искать последовательные не запятые и скобки и исключать окружающие пробелы, а затем обертывать кавычки. – mario

+1

Вам нужно поделиться регулярным выражением, которое у вас уже есть. Это должно помочь вам быстрее получить ответ – Machavity

ответ

1

Для несколько грубоват, но контекстно-зависимые регулярное выражение можно использовать:

$str = preg_replace("~ [\[\],\s]*\K [^,\[\]]+ ~x", '"$0"', $str); 
          ↑    ↑ 
         skip ][, capture non- 
         + space commas/brackets 

Где charclass перед тем \K скачет структурных символов, а второй […] находит только что-нибудь, кроме запятых и скобок - которые затем завернутый в кавычки.

+0

Хотя это может быть расширено, оно предназначено только для ввода образца. (Запросы перезаписи будут проигнорированы.) – mario

+0

Отлично работает! Большое вам спасибо. – Jack1204

-1

процесса эта строка, что-то подобное,

$sample = explode('],', $array); 

foreach ($sample as &$v) 
{ 
    $v = array_map('trim', explode(',', trim($v, '[ ]'))); 
} 

Теперь массив становится

array (
    0 => 
    array (
    0 => 'Smarties', 
    1 => '50g', 
    2 => '3', 
    3 => '1.99', 
), 
    1 => 
    array (
    0 => 'M&Ms Peanut', 
    1 => '49g', 
    2 => '3', 
    3 => '1.99', 
), 
    2 => 
    array (
    0 => 'Oreo Cookies', 
    1 => '300g', 
    2 => '1', 
    3 => '3.99', 
), 
    3 => 
    array (
    0 => 'Pepsi', 
    1 => '355ml', 
    2 => '3', 
    3 => '1.29', 
), 
) 

Просто json_encode() даст,

string '[["Smarties","50g","3","1.99"],["M&Ms Peanut","49g","3","1.99"],["Oreo Cookies","300g","1","3.99"],["Pepsi","355ml","3","1.29"]]' (length=128) 
+0

Вам также необходимо иметь ' msgstr "" "вставлено в начале и в конце строки, а также – Machavity

+0

Да, абсолютно, вы правы, проверьте обновление @Machavity – Viral

0

Один не является оптимальным, но работающий пример :

$result = json_decode(strtr(strtr($yourString, array('['=>'["', ']'=>'"]', ', '=>'","', ']","['=>'],[')), array(']","[' => '],[', '["[' => '[[', ']"]' => ']]')), true); 
Смежные вопросы