Extra backslash needed in PHP regexp pattern

后端 未结 4 997
醉梦人生
醉梦人生 2020-11-28 13:22

When testing an answer for another user\'s question I found something I don\'t understand. The problem was to replace all literal \\t \\n \\r

相关标签:
4条回答
  • 2020-11-28 13:29

    Its works in perl because you pass that directly as regex pattern /(?:\\[trn])+/

    but in php, you need to pass as string, so need extra escaping for backslash itself.

    "/(?:\\\\[trn])+/"
    

    The regex \ to match a single backslash would become '/\\\\/' as a PHP preg string

    0 讨论(0)
  • 2020-11-28 13:45

    You need 4 backslashes to represent 1 in regex because:

    • 2 backslashes are used for unescaping in a string ("\\\\" -> \\)
    • 1 backslash is used for unescaping in the regex engine (\\ -> \)

    From the PHP doc,

    escaping any other character will result in the backslash being printed too1

    Hence for \\\[,

    • 1 backslash is used for unescaping the \, one stay because \[ is invalid ("\\\[" -> \\[)
    • 1 backslash is used for unescaping in the regex engine (\\[ -> \[)

    Yes it works, but not a good practice.

    0 讨论(0)
  • 2020-11-28 13:50

    The regular expression is just /(?:\\[trn])+/. But since you need to escape the backslashes in string declarations as well, each backslash must be expressed with \\:

    "/(?:\\\\[trn])+/"
    '/(?:\\\\[trn])+/'
    

    Just three backspaces do also work because PHP doesn’t know the escape sequence \[ and ignores it. So \\ will become \ but \[ will stay \[.

    0 讨论(0)
  • 2020-11-28 13:52

    Use str_replace!

    $code = str_replace(array("\t","\n","\r"),'',$code);
    

    Should do the trick

    0 讨论(0)
提交回复
热议问题