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)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助