Description="PHP" Keywords={ { Id=1, List={"abstract", "and", "array", "as", "break", "case", "catch", "cfunction", "class", "clone", "const", "continue", "declare", "default", "do", "else", "elseif", "enddeclare", "endfor", "endforeach", "endif", "endswitch", "endwhile", "extends", "final", "for", "foreach", "function", "global", "goto", "if", "implements", "interface", "instanceof", "namespace", "new", "old_function", "or", "private", "protected", "public", "static", "switch", "throw", "try", "use", "var", "while", "xor", "__CLASS__", "__DIR__", "__LINE__", "__FILE__", "__FUNCTION__", "__TRAIT__", "__METHOD__", "__NAMESPACE__", "die", "echo", "empty", "exit", "eval", "include", "include_once", "isset", "list", "require", "require_once", "return", "print", "unset", "true", "false", "null", "resource" }, }, { Id=2, List={"int", "integer", "real", "double", "float", "string", "array", "object", "bool", "mixed", "numeric"}, }, { Id=3, Regex=[[\$\w+]], }, { Id=4, Regex=[[(\w+)\s*\(]], }, } -- hereDoc opening delimiter, see OnStateChange to handle end of string Strings={ Delimiter=[["|'|<<<'?\w+'?]], --Interpolation=[[ \$[\w\[\]\->]+ ]], Interpolation=[[ [@\$%]\w+ ]] } IgnoreCase=true Comments={ { Block=false, Delimiter= { [[\/\/|\#]] }, }, { Block=true, Nested=false, Delimiter= { [[\/\*]],[[\*\/]],} } } Operators=[[\(|\)|\[|\]|\{|\}|\,|\;|\:|\&|<|>|\!|\=|\/|\*|\|\+|\-|\.|\@]] function OnStateChange(oldState, newState, token) if oldState==HL_STRING and token==hereDoc then hereDoc = nil return HL_STRING_END end if (string.sub(token,1,1) =="$") and oldState==HL_STRING and newState==HL_KEYWORD then return HL_INTERPOLATION end if hereDoc~=nil then return HL_STRING end --recognize hereDoc multine strings if oldState==HL_STANDARD and newState==HL_STRING and not string.find("\"'", token) then hereDoc = string.match(token, "<<<'?(%a+)" ) end if oldState~=HL_STRING and newState==HL_ESC_SEQ then return oldState end return newState end