【问题标题】:Using preg_replace to add quotes to array使用 preg_replace 将引号添加到数组
【发布时间】:2015-08-17 18:23:36
【问题描述】:

我有这个数组:

$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,希望有人能提供帮助。

有没有办法使用分隔逗号作为指导来确定引号的位置?

【问题讨论】:

  • 您可以使用lookaround assertions,例如(?<=\[)(?!\s*\()。虽然查找连续的非逗号和括号并排除周围的空格可能更容易,然后用引号括起来。
  • 你应该分享你已经拥有的正则表达式。它应该可以帮助您更快地获得答案

标签: php arrays regex preg-replace


【解决方案1】:

对于一个有点粗略但可以感知上下文的正则表达式,可以使用:

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

\K 之前的 charclass 跳过结构字符,而第二个 […] 只找到除逗号和括号之外的任何内容 - 然后用引号括起来。

【讨论】:

  • 虽然这可以扩展,但它仅用于示例输入。 (重写请求将被忽略。)
  • 完美运行!非常感谢。
【解决方案2】:

一个不是最佳但可行的例子:

$result = json_decode(strtr(strtr($yourString, array('['=>'["', ']'=>'"]', ', '=>'","', ']","['=>'],[')), array(']","[' => '],[', '["[' => '[[', ']"]' => ']]')), true);

【讨论】:

    【解决方案3】:

    处理这个字符串,比如,

    $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)
    

    【讨论】:

    • 你还需要在字符串的开头和结尾插入"
    • 是的,绝对的,你是对的,检查更新@Machavity
    猜你喜欢
    • 2013-07-02
    • 2013-10-22
    • 2019-05-02
    • 2013-08-04
    • 2012-05-15
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多