如果它们与正则表达式模式不匹配,如何深度重命名数组键

时间:2019-08-21 09:29:52

标签: php arrays regex xml

我需要将JSON对象转换为XML文档。我使用this class可以很好地完成工作。

问题是,当元素名称(W3C)非法时,有时我的JSON对象具有会引发类异常的属性,例如此输入:

{"first":"hello","second":{"item1":"beautiful","$item2":"world"}}
  

标签名称中的字符非法。标签:$ item2节点:秒

触发的功能是:

/*
 * Check if the tag name or attribute name contains illegal characters
 * Ref: http://www.w3.org/TR/xml/#sec-common-syn
 */
private static function isValidTagName($tag){
    $pattern = '/^[a-z_]+[a-z0-9\:\-\.\_]*[^:]*$/i';
    return preg_match($pattern, $tag, $matches) && $matches[0] == $tag;
}

然后我想做的是在将JSON输入转换为XML之前对其进行“清理”。

因此,我需要具有一个在将输入数据转换为XML之前重新格式化输入数据的功能。

function clean_array_input($data){
    //recursively clean array keys so they are only allowed chars
}

$data = json_decode($json, true);
$data = clean_array_input($data);

$dom = WPSSTMAPI_Array2XML::createXML($data,'root','element');
$xml = $dom->saveXML($dom);

我该怎么做?谢谢!

1 个答案:

答案 0 :(得分:0)

我认为您想要的是这样的东西。创建一个新的空数组,递归遍历数据和过滤键。最后返回新数组。为了防止重复的键,我们将使用uniqid。

function clean_array_input($data){

    $cleanData = [];
    foreach ($data as $key => $value) {

        if (is_array($value)) {
            $value = clean_array_input($value);
        }

        $key = preg_replace("/[^a-zA-Z0-9]+/", "", $key);
        if (isset($cleanData[$key])) {
            $key = $key.uniqid();
        }

        $cleanData[$key] = $value;
    }

    return $cleanData;
}