求一个更聪明的方法:将字符串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);
}
魔力的新月
10 years, 1 month ago
Answers
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/
只不过代码写起来,肯定没有直接挨个字符对比的省事。
阿良々木火憐
answered 10 years, 1 month ago
for($i=0;$i<strlen($a);$i++) {
$currentPartA = substr($a,0,$i); //截取相同长度的字符串
$currentPartB = substr($b,0,$i);
if($currentPartA == $currentPartB) {
$prevWord = substr($a,$i-1,1);
if($prevWord == '/') {
$leftA = substr($a,$i); // 如果当前截取的字符串相同 并且前一个是‘/’,则获取一次
continue;
}
} else {
break;
}
}
echo $leftA;
尤RIena
answered 10 years, 1 month ago
先把题目理解成路径匹配(而非纯字符串)
那么
array_diff_assoc
可能是题主想要的方法
更新 解决 @AlanZhang 提的bug
php
<?php $a = '/www/proj-asd/app/home/news'; $b = '/www/proj-asd/app/_view/news'; echo getRelPath($a, $b); // home/news function getRelPath($a, $b) { $a = explode('/', $a); $b = explode('/', $b); $diff = array_diff_assoc($a, $b); return implode('/', array_slice($a, key($diff))); }
天下都是百合
answered 10 years, 1 month ago