public static function parse($p_string, $p_data = array(), $p_regex = null)
    {
        if (! is_array($p_data)) {
            if (is_object($p_data) && method_exists($p_data, '__toArray')) {
                $datas = $p_data->__toArray();
            }
        } else {
            $datas = $p_data;
        }
        if ($p_regex === null) {
            $p_regex = self::REGEX_PARAM_PLACEHOLDER;
        }
        if (0 < preg_match_all($p_regex, $p_string, $matches, PREG_SET_ORDER)) {
            foreach ($matches as $match) {
                $replace = '';
                if (array_key_exists($match[1], $datas)) {
                    $replace = $datas[$match[1]];
                }
                $p_string = str_replace(
                    $match[0],
                    $replace,
                    $p_string
                );
            }

            return self::parse($p_string, $datas, $p_regex);
        }

        return $p_string;
    }