Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
589 views
in Technique[技术] by (71.8m points)

regex - Extra backslash needed in PHP regexp pattern

When testing an answer for another user's question I found something I don't understand. The problem was to replace all literal characters from a string with a single space.

Now, the first pattern I tried was:

/(?:\[trn])+/

which surprisingly didn't work. I tried the same pattern in Perl and it worked fine. After some trial and error I found that PHP wants 3 or 4 backslashes for that pattern to match, as in:

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

or

/(?:\[trn])+/

these patterns - to my surprise - both work. Why are these extra backslashes necessary?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...