think\Template::getRegex PHP Method

getRegex() private method

按标签生成正则
private getRegex ( string $tagName ) : string
$tagName string 标签名
return string
    private function getRegex($tagName)
    {
        $regex = '';
        if ('tag' == $tagName) {
            $begin = $this->config['tpl_begin'];
            $end = $this->config['tpl_end'];
            if (strlen(ltrim($begin, '\\')) == 1 && strlen(ltrim($end, '\\')) == 1) {
                $regex = $begin . '((?:[\\$]{1,2}[a-wA-w_]|[\\:\\~][\\$a-wA-w_]|[+]{2}[\\$][a-wA-w_]|[-]{2}[\\$][a-wA-w_]|\\/[\\*\\/])(?>[^' . $end . ']*))' . $end;
            } else {
                $regex = $begin . '((?:[\\$]{1,2}[a-wA-w_]|[\\:\\~][\\$a-wA-w_]|[+]{2}[\\$][a-wA-w_]|[-]{2}[\\$][a-wA-w_]|\\/[\\*\\/])(?>(?:(?!' . $end . ').)*))' . $end;
            }
        } else {
            $begin = $this->config['taglib_begin'];
            $end = $this->config['taglib_end'];
            $single = strlen(ltrim($begin, '\\')) == 1 && strlen(ltrim($end, '\\')) == 1 ? true : false;
            switch ($tagName) {
                case 'block':
                    if ($single) {
                        $regex = $begin . '(?:' . $tagName . '\\b(?>(?:(?!name=).)*)\\bname=([\'\\"])(?P<name>[\\$\\w\\-\\/\\.]+)\\1(?>[^' . $end . ']*)|\\/' . $tagName . ')' . $end;
                    } else {
                        $regex = $begin . '(?:' . $tagName . '\\b(?>(?:(?!name=).)*)\\bname=([\'\\"])(?P<name>[\\$\\w\\-\\/\\.]+)\\1(?>(?:(?!' . $end . ').)*)|\\/' . $tagName . ')' . $end;
                    }
                    break;
                case 'literal':
                    if ($single) {
                        $regex = '(' . $begin . $tagName . '\\b(?>[^' . $end . ']*)' . $end . ')';
                        $regex .= '(?:(?>[^' . $begin . ']*)(?>(?!' . $begin . '(?>' . $tagName . '\\b[^' . $end . ']*|\\/' . $tagName . ')' . $end . ')' . $begin . '[^' . $begin . ']*)*)';
                        $regex .= '(' . $begin . '\\/' . $tagName . $end . ')';
                    } else {
                        $regex = '(' . $begin . $tagName . '\\b(?>(?:(?!' . $end . ').)*)' . $end . ')';
                        $regex .= '(?:(?>(?:(?!' . $begin . ').)*)(?>(?!' . $begin . '(?>' . $tagName . '\\b(?>(?:(?!' . $end . ').)*)|\\/' . $tagName . ')' . $end . ')' . $begin . '(?>(?:(?!' . $begin . ').)*))*)';
                        $regex .= '(' . $begin . '\\/' . $tagName . $end . ')';
                    }
                    break;
                case 'restoreliteral':
                    $regex = '<!--###literal(\\d+)###-->';
                    break;
                case 'include':
                    $name = 'file';
                case 'taglib':
                case 'layout':
                case 'extend':
                    if (empty($name)) {
                        $name = 'name';
                    }
                    if ($single) {
                        $regex = $begin . $tagName . '\\b(?>(?:(?!' . $name . '=).)*)\\b' . $name . '=([\'\\"])(?P<name>[\\$\\w\\-\\/\\.\\:@,\\\\]+)\\1(?>[^' . $end . ']*)' . $end;
                    } else {
                        $regex = $begin . $tagName . '\\b(?>(?:(?!' . $name . '=).)*)\\b' . $name . '=([\'\\"])(?P<name>[\\$\\w\\-\\/\\.\\:@,\\\\]+)\\1(?>(?:(?!' . $end . ').)*)' . $end;
                    }
                    break;
            }
        }
        return '/' . $regex . '/is';
    }