dooso0594 2016-09-23 00:37
浏览 126
已采纳

无法使用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 :)

  • 写回答

1条回答 默认 最新

  • douzi4766 2016-09-23 12:47
    关注

    Try to use negative lookbehind in regex. Like this:

    preg_replace("/(?<!\\\\)([^a-z0-9\\\\ 
    ])/i","\\\\$1",$input)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?