You can suppress backtracking in the .*? with (?>.*?), but that always makes that part match zero characters. It really has to backtrack into the .*? to try grabbing more characters before matching $target. Does that make sense?
(?>.*?$target) may be what you want, but I'm not sure it will make any difference once you've switched to using [^>]* in the later part.
Comment on Re: Removing backtracking from a .*? regexp