Following the link by @bishop, I found an example using negative lookahead that works for me.
I changed
.+?(?<! \*/)
to
(?:(?! \*/).)+?
So the full pattern is now:
/\*\*(?:(?! \*/).)+?@access public.+? \*/\s+?function\s+[a-zA-Z0-9_]+\(
EDIT:
Full pattern that also matches function types and parameters:
(?<full>[\t ]*?/\*\*(?:(?! \*/).)+?@access public(?:(?! \*/).)+? \*/\s+?(?:public |protected |private )??(?:static )??function\s+[a-zA-Z0-9_]+\(.*?\))
And class matching:
(?<full>(?<indent>[\t ]*?)/\*\*(?:(?! \*/).)+?@access public.+? \*/\s+?(?:abstract )??class\s+[a-zA-Z0-9_]+\s??.*?{)