It seems that your description of the problem almost writes the regex itself, namely,
qr/(?<=^| )($phrases_re)(?= |$)/
This says, literally, “one of the phrases in $phrases_re
, preceded by a space or the beginning of the string” (which you didn't specify, but I assume you meant) “and followed by a space or the end of the string.”
UPDATE: Thanks to Crackers2 for pointing out that my original version, qr/(?:^| )($phrases_re)(?: |$)/, didn't work correctly, and that look-around would fix it.
UPDATE 2: Oops, I should have tested—as ambrus observed, this one doesn't work, either, for the silly reason that it doesn't compile. :-) That post and its descendants have some solutions.