If we can assume that the character sequence "]]" would only occur in the case of this special syntax, you could use:
preg_match_all('/[^[|]+(?=]])/', $text, $matches);
// matches would be in $matches[0]
If that is not a safe assumption, then:
preg_match_all('/(?<=\[\[)(?:[^\]]*\|)?([^]]+)(?=]])/', $text, $matches);
// matches would be in $matches[1]