PHP Regex使用下划线preg_replace hypen如果word在末尾有冒号

时间:2016-12-30 21:21:44

标签: php regex preg-replace

我得到了一个JSON响应,并且我试图使用preg_replace在PHP中使用下划线(_)替换hypen( - )以保持一致性。

实施例;

[
  {
    "name": "Disable Comments",
    "slug": "disable-comments",
    "required": true,
    "force-activation": true,
    "force-deactivation": true
  },
  {
    "name": "Intuitive Custom Post Order",
    "slug": "intuitive-custom-post-order",
    "required": true,
    "force-activation": false,
    "force-deactivation": true
  }
]

我试图只针对键,所以任何以冒号结尾的东西。我尝试了很多变化,但似乎无法接近。

4 个答案:

答案 0 :(得分:3)

我会在已解码的数组上而不是在JSON本身上进行。

$array = json_decode($json, true);

foreach ($array as &$subarray) { // Use reference so we can modify the subarray in place
    foreach ($subarray as $key => $value) {
        $new_key = str_replace('-', '_', $key);
        if ($new_key != $key) {
            $subarray[$new_key] = $value;
            unset($subarray[$key]);
        }
    }
}

$json = json_encode($array);

答案 1 :(得分:1)

在json编码的字符串上进行字符串操作是一项不明智的技术-意外/无声地突变意外目标的风险根本不值得在微观上获得性能提升(如果有的话)。

解析和迭代数据,然后专门针对要替换的密钥,更好/更可靠。

一种实用的方法:(Demo

var_export(
    array_map(
        function($subarray) {
            return array_combine(
                    str_replace('-', '_', array_keys($subarray)),
                    $subarray
                );
        },
        json_decode($json, true)
    )
);

通过语言构造循环并通过引用进行修改:(Demo

$array = json_decode($json, true);
foreach ($array as &$subarray) {
    $subarray = array_combine(
                    str_replace('-', '_', array_keys($subarray)),
                    $subarray
                );
}
var_export($array);

不使用array_combine生成新数组:(Demo

foreach (json_decode($json, true) as $index =>$subarray) {
    foreach ($subarray as $key => $value) {
        $array[$index][str_replace('-', '_', $key)] = $value;
    }
}
var_export($array);

这些技术可以根据个人喜好进行混合n匹配。一个开发人员可能更喜欢函数式技术,因为它们需要较少的声明变量。其他开发人员可能会寻求使用语言构造和最少数量的函数调用来提高性能。

答案 2 :(得分:0)

对于这样的小json字符串可能是一种矫枉过正但如果你仍然想要使用带有preg-replace的正则表达式,你可以通过以下方式实现所需的输出:

preg_replace('/(".*)(-)(.*:\s)/','$1_$3',$json)

你是$json json string。

使用所述正则表达式,您可以捕获3个不同的组。

  1. 第一个(".*),抓住json元素键的开头直到 连字符。
  2. 第二个(-),捕获连字符。
  3. 第三个(.*:\s),抓住钥匙的其余部分直到空间 字符     在:之后。
  4. 如果这些群组匹配在一起,那么他们会回复您,您可以将每个群组匹配与占位符$1$2$3一起使用。因为您要替换连字符,只需将替换构造为由占位符$1$3组成的字符串,用连字符分隔。

    编辑:正如@Toto指出的那样,这对于标准格式化的json字符串不起作用,而不是OP提供的示例。 更新的正则表达式将是:

    preg_replace('/("[\w]*)(-)([\w]*"[\s]*:)/','$1_$3',$json)
    

    我刚刚更改了第一个和第三个匹配组以匹配任何单词字符\w零次或多次,并且在第三个匹配组中我添加了匹配任何空格以便能够匹配格式的可能性或没有空格:

      ... "force-activation": true, "force-activation" : true, ...
    

答案 3 :(得分:-1)

你可以使用这个:

get_path(s, t) {
    if A[s][t] = s or A[s][t] = t then return [s]
    // + is here the concatenation
    return get_path(s, A[s][t]) + get_path(A[s][t], t)
}