public function untag($tag = null)
    {
        if(!is_null($tag)){
            $allowed = '';

            $tagify = function($tag){

                $output = function($str){
                    $str = preg_replace('@[</>]+@', '', $str);
                    return '<'.$str.'>';
                };


                if($tag instanceof \DOMNode){
                    return $output($tag->nodeName);
                } elseif(
                    (is_object($tag) && method_exists($tag, '__toString'))
                    ||
                    is_string($tag)
                ){
                    $prov_str = "$tag";

                    $prov_str = preg_replace('@[</>\s]+@', ' ', $prov_str);
                    $arr = preg_split('/[ ,;|]/ui', $prov_str);
                    $str = '';

                    foreach($arr as $a){
                        $str .= $output($a);
                    }

                    return $str;
                } else {
                    throw new \InvalidArgumentException(
                        'Allowed tags not recognized. Bad type?'
                    );
                }

            };

            if($tag instanceof A || $tag instanceof H || is_array($tag)){
                if(is_object($tag)){
                    $tag = array_values($tag->array);
                }
                
                foreach($tag as $t){
                    $allowed .= $tagify($t);
                }
            } elseif(
                $tag instanceof \DOMNode
                ||
                (is_object($tag) && method_exists($tag, '__toString'))
                ||
                is_string($tag)
            ){
                $allowed .= $tagify($tag);
            } else {
                throw new \InvalidArgumentException(
                    'Allowed tags not recognized. Bad type?'
                );
            }

            return new self(strip_tags($this->value, $allowed));
        }
        
        return new self(strip_tags($this->value));
    }