I don't think you need to include the u unicode flag for this task.
Simply disqualify the undesirable spaces with (*SKIP)(*FAIL) then replace all qualifying spaces.
Code: (Demo) (Pattern Demo)
$string = '英文 中文 English something else';
echo preg_replace('/[a-z] [a-z](*SKIP)(*FAIL)| /i','_',$string);
Output:
英文_中文_English something else
Pattern Explanation:
[a-z] [a-z](*SKIP)(*FAIL) <-- this means match and discard the letter-space-letter occurrences
| <-- this mean "OR"
<-- this will match every non-discarded space in the string (only these will be replaced
Two alternatives with lookarounds will also work (and faster): (Demo)
/(?<![a-z]) | (?![a-z])/i
Fastest of all will be the \B (negated version of the word boundary metacharacter): (Demo)
/\B | \B/