求一个更聪明的方法:将字符串A开头与字符串B开头相同的部分去掉。
将字符串A开头 与字符串B开头 相同的部分去掉。
比如
$a = '/www/proj-asd/app/home/news';
$b = '/www/proj-asd/app/_view';
那么需要提取出来的部分就是 home/news
笨方法是:
$a = '/www/proj-asd/app/home/news';
$b = '/www/proj-asd/app/_view';
echo getRelPath($a, $b); // home/news
function getRelPath($a, $b)
{
$a = strtr($a, '\\', '/');
$b = strtr($b, '\\', '/');
$a = explode('/', $a);
$b = explode('/', $b);
foreach ($a as $i=>$av) {
$bv = $b[$i];
if ($av===$bv) {
unset($a[$i]);
}else{
break;
}
}
return implode('/', $a);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
先把题目理解成路径匹配(而非纯字符串)
那么
array_diff_assoc
可能是题主想要的方法更新 解决 @AlanZhang 提的bug
http://3v4l.org/eB8Km
要求全字符匹配只能想到每个字符都去匹配
坐等楼下好办法
用回调不是更快?如果确定是地址的话,先转数组再用回调,思路大同小异,就不写了。
jsven的方法和楼主的一样。
邹世杰的方法其实也和楼主一样,不过是递归版。
我这里说一个思路,取a b的长度最小值。
然后做二分法。
$a = '/www/proj-asd/app/home/news';
$b = '/www/proj-asd/app/_view';
截半,/www/proj-a 相同。
剩下'sd/app/_view',再截半,
是sd/app/,相同。此时相同的部分为/www/proj-asd/app/
剩下是'home/' 和'view' 比较。
截半,ho和_v,不同。
再截半,h和,不同。
所以相同部分为/www/proj-asd/app/
只不过代码写起来,肯定没有直接挨个字符对比的省事。
如果是为了编辑一个文件列表,比如SVN的log中的文件列表去掉版本库目录,可以直接用列编辑:
gg - 移到开头
Ctrl+v - 开始列模式
w或l - 向右移动光标到所需要的位置
...
x - 删除公共前缀
熟练后比Ctrl+h快多了
直接写个正则替换为空的不就行了这么费事。。。。
replace(str|rgExp,’‘) 替换字符串
这里的替换只能执行一次,不能够进行全局匹配,如果需要全局匹配,则应使用正则表达式