2 of 3 added 405 characters in body

R, 30 27 bytes

rev(rev(scan(,'')[-1])[-1])

Takes input from stdin, returns each middle name as a separate string. Returns character() in the case of no middle name; that is, a vector of class character of length 0.

Explanation:

Read stdin into a list of strings, separated by spaces

        scan(,'')

Remove the first element (i.e. the first name).

        scan(,'')[-1]

Reverse this list, and remove the first element (i.e. the surname).

    rev(scan(,'')[-1])[-1])

Reverse this list again, and it's the middle name(s) in the original order.

rev(rev(scan(,'')[-1])[-1])