求大牛解释下这个正则表达式:/^.+[\\\\\\/]/,最主要是为什么要那么多的转义字符,

当然了我理解他是想对\和/进行单选,但为什么要那么多。functionsbasename($filename){returnpreg_replace('/^.+[\\\\... 当然了我理解他是想对\和/进行单选,但为什么要那么多。
function sbasename($filename)
{
return preg_replace('/^.+[\\\\\\/]/', '', $filename);
}
这是源码,网上copy,运行ok
功能是取得路径中的文件名称,因为basename()方法不能取得含有中文名称的文件
展开
 我来答
百度网友a19d193
推荐于2017-11-25 · TA获得超过3446个赞
知道大有可为答主
回答量:1464
采纳率:100%
帮助的人:1443万
展开全部
这个看语境的,理论上\\ 和\/就足够了,但是某些情况下这个字符串需要进行二次转义,所以\\就变成了\\\\,\/变成了\\/
比如$i = "\\\\\\/";
$reg = "/^.+" . $i . "/";
更多追问追答
追问
嗯,很好!但依然不理解有哪些情况需要进行二次转义。
追答
刚才说的有点乱,其实正则表达式本身就是需要二次转义的。是这样,对于字符串来说,'\'是需要转义的,如果你希望最后的结果是'\',那么必须用\\代替,这个可以明白撒?
然后,对于正则表达式来说,\和/都是特殊字符,所以必须使用\\和\/。
现在你的表达式写在引号里面,PHP解析器首先从引号中获取值,得到\\\/,然后正则表达式解析器解析\\\/得知你想要字符\和/
很绕嘴啊,解释清楚没?
扎俊
2013-03-11 · 知道合伙人互联网行家
扎俊
知道合伙人互联网行家
采纳数:366 获赞数:1525
涉猎C#;C++,vb,vb script,asp,PHP,JS,w3c,网站运营、推广等

向TA提问 私信TA
展开全部
你好,在JS里只是对\和/进行单个匹配的话这样就可以了/[\\\/]/
在正则表达式里,中括号[] 里的内容是一个集合,同样的字符,多个和一个是同样的效果。
追问
感谢专家!
来自:求助得到的回答
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yukon12345
2016-03-12 · TA获得超过1713个赞
知道大有可为答主
回答量:1827
采纳率:66%
帮助的人:1003万
展开全部

我来告诉你吧!其实这代码是一个一堆人转载时候的误传,本身用

return preg_replace('/^.+[\\/]/', '', $filename);


就直接可以了。为毛多出那么多\\\\呢?由于\是敏感字符,某些网站会对\进行过滤。尤其是在php老版本(5.5已经没有了)默认开启magic_quotes_gpc时候,会对所有\进行添加\防止被黑。然后这个程序被转来转去,自动就加了很多个\

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
在水府庙思绪万千的锦鲤
2013-03-11 · 超过23用户采纳过TA的回答
知道答主
回答量:69
采纳率:0%
帮助的人:45.8万
展开全部
两边的斜线(/)不看
正则是 ^.+[\\\\\\/]
^表示这个是开始位置
.表示除“\n”之外的任何单个字符
+表示匹配前面的那个字符1次或多次
[] 表示可选字符

下面这些都可以匹配:
ww\\\\\\\\\\
cc\
a\
bb//////////////////
b/
c/
kkkkkkk/
kkkkkkk\
kkkkkkk///

它跟 ^.+[\\/] 的效果是一样的。
至于它为什么要那么写3个反斜线,大概是因为他很闲吧。
更多追问追答
追问
\\\\\\/和\\/是不一样滴,我说了,在中括号里,他是想对\和/进行二选一。
\\/代表的是/,再前面\\代表的是\,我不理解的是为什么前面还有两个\转义符
追答
\\是转义\
/不需要转义
它的代码可能在用的时候需要转移\
比如C/C++:
char* regex = "\\\\";//这个正则是\\
char regex2 ="\\\\/";//这个正则是\\/
应该不是
\\\ \\\/
而是
\\ \\ \\ /
实际的正则应该是 \\/
这个/不需要转义,应该写成\\ \\ /

我没见过对/转义的。
来自:求助得到的回答
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
普怀曼0c
2013-03-11
知道答主
回答量:28
采纳率:0%
帮助的人:9.5万
展开全部
\\是正则的转义处理一些特殊字符的
\\\是\
*************************
\\\\是因为在winxp中需要前面在带一个\

那个就是带三个\\\加一个/就可以了

你写的那个怎么那么多\,O(∩_∩)O,是不是你搞错了
追问
感谢!
代码是网上copy的,而且我运行也没有出错!所以...
function sbasename($filename)
{
return preg_replace('/^.+[\\\\\\/]/', '', $filename);
}
功能是取得路径中的文件名称,因为basename()方法不能取得含有中文名称的文件
\\\\是因为在winxp中需要前面在带一个\。这个真没听过
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式