时间:2021-07-01 10:21:17 帮助过:15人阅读
比如
- <code>$a = '/www/proj-asd/app/home/news';
- $b = '/www/proj-asd/app/_view';
- </code>
那么需要提取出来的部分就是 home/news
笨方法是:
- <code>$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);
- }
- </code>
将字符串A开头 与字符串B开头 相同的部分去掉。
比如
- <code>$a = '/www/proj-asd/app/home/news';
- $b = '/www/proj-asd/app/_view';
- </code>
那么需要提取出来的部分就是 home/news
笨方法是:
- <code>$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);
- }
- </code>
先把题目理解成路径匹配(而非纯字符串)
那么array_diff_assoc
可能是题主想要的方法
更新 解决 @AlanZhang 提的bug
- <code>php</code><code><!--?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)));
- }
- </code--></code>
http://3v4l.org/eB8Km
要求全字符匹配只能想到每个字符都去匹配
- <code>for(var index=0;index<$a.length;index++){
- if($a.charAt(index)!=$b.charAt(index)){
- return $a.substring(index);
- }
- }
- </code>
坐等楼下好办法
- <code>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;="" <="" code=""></strlen($a);$i++)></code>
用回调不是更快?如果确定是地址的话,先转数组再用回调,思路大同小异,就不写了。
- <code>$a = '/www/proj-asd/app/home/news';
- $b = '/www/proj-asd/app/_view';
- function getRelPath($a, $b){
- if($a[0] != $b[0]) return $a;
- return getRelPath(substr($a, 1), substr($b, 1));
- }
- var_dump(getRelPath($a, $b));
- </code>
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快多了
- <code>可以配合字符串查找位置函数替换掉
- 不过还是推荐使用shell处理
- </code>
直接写个正则替换为空的不就行了这么费事。。。。
人气教程排行
-
174次
1
php如何获取跳转前的url
-
174次
2
php格林威治时间转换成当前时间的方法
-
174次
3
为什么php不能做大型系统?
-
174次
4
range函数怎么用
-
174次
5
php中计算页面加载时间几种方法总结_PHP教程
-
174次
6
求帮助,关于paypal支付返回值修改订单状态
-
174次
7
typecho怎么配置文章内容页?
-
174次
8
PhpStorm左侧structure不显示文件的方法列表是这么回事?
-
174次
9
查看PHP的环境变量_PHP
-
174次
10
PHP Primary script unknown 解决方法总结
-
174次
11
php的命名空间与自动加载实现方法
-
174次
12
解决laravel 出现ajax请求419(unknown status)的问题
-
173次
13
php 如何删除mysql记录
-
173次
14
PHP如何替换数组中的指定元素
-
173次
15
怎么去除字符串中非汉字、非字母、非数字的字符
-
173次
16
mysql如何一次执行多条SQL语句
-
173次
17
修改header里面的Connection为close解决方法
-
173次
18
PHP基于session.upload_progress 实现文件上传进度显示功能详解
-
173次
19
php5.6.x到php7.0.x特性小结
-
172次
20
php为什么会出现504错误