This solves the problem:
$pattern = "/([a-zA-Z]+[a-zA-Z?><;,{}[\]\-_+=!@#$%\^*|']*)/";
$replacement = '<span dir="ltr">${1}</span>';
$subject = preg_replace($pattern, $replacement, $subject);
It matches English alphabet plus some extra characters, but note that you should not include &
in the extra characters since the HTML encoding of the Unicode characters begins with &
.