无法使用PHP中的preg_replace正确转义未转义的特殊字符

I'm trying to use preg_replace to escape all special characters in a multi-line string with a backslash, but this string gets passed out and passed back in repeatedly, so to avoid any confusion I wanted to use a regex which only escapes un-escaped special characters (also excluding spaces, newlines, carriage returns and the escape character itself). I.e.,:

$foo \$bar :\:

Should be escaped to become:

\$foo \$bar \:\:

And NOT escaped twice like below:

\$foo \\$bar \:\\:\

I've gotten close with the following:

preg_replace("/([^\\\\])([^a-z0-9\\\\ 
])/i","$1\\\\$2",$input);

But when two of the same special characters appear in sequence, only the first of the two gets escaped.

For example:

....

Becomes:

\..\..

But really I want:

\.\.\.\.

Sorry for the ridiculous issue, or if i'm doing anything stupid! Thanks in advance :)

Try to use negative lookbehind in regex. Like this:

preg_replace("/(?<!\\\\)([^a-z0-9\\\\ 
])/i","\\\\$1",$input)