一直在寻找这个,这是我无法弄清楚的。
我想替换以下字符串的粗体部分:
/ pano_virtual /公共/管理/内容/编辑/ 2
如果它匹配以下字符串的任何部分:
http://localhost/pano_virtual/public/
正如您所看到 / pano_virtual / public / 部分匹配,如果匹配,我想将其从第一个字符串中删除。
我不能使用simle str_replace,因为两个字符串将随着不同的服务器和不同的网站而改变,但第一部分的第一部分将始终与第二个字符串的最后部分匹配。
这可能吗?
非常感谢提前!
编辑 - 解决了!:
我设法弄明白了,但这不是最好的解决方案,但它有效:
// $_SERVER['REQUEST_URI'] is the first string
// URL_ROOT is the second string
$url_root_substring = '';
$root_count = strlen(URL_ROOT);
$start = 0;
while($start < $root_count) {
$substring = substr(URL_ROOT.'/',$start,$root_count);
if($substring == substr($_SERVER['REQUEST_URI'],0,strlen($substring))) {
$url_root_substring = $substring;
break;
}
$start++;
}
答案 0 :(得分:0)
答案 1 :(得分:0)
在我看来,您正在尝试匹配路径,而不是字符串。我猜你不希望http://host/foobar
匹配barcamp/whatever
。
所以我建议在“/”上拆分字符串。然后,只需迭代“http”数组,查找“path”数组中的第一个元素。如果找到匹配项,则前进到第二个元素,等等。如果两个元素不匹配,则重置为“path”数组的开头。如果你到达“http”数组的末尾并且最后一个元素匹配,那么你有最长的公共路径(如果没有,那么没有任何共同点)。
答案 2 :(得分:0)
$path_1 = '/pano_virtual/public/admin/content/edit/2';
$path_2 = 'http://localhost/pano_virtual/public/';
$pattern = '#^(https?:/)?/?([^/].*[^/])/?$#i';
preg_match($pattern, $path_1, $matches);
$clean_path_1 = $matches[2];
preg_match($pattern, $path_2, $matches);
$clean_path_2 = $matches[2];
$path_1_parts = explode('/', $clean_path_1);
$path_2_parts = explode('/', $clean_path_2);
$consider_path_2 = $path_2_parts;
$high_count = 0;
foreach($path_2_parts as $p2p)
{
$consider_path_1 = $path_1_parts;
foreach($path_1_parts as $p1p)
{
if($consider_path_1==$consider_path_2)
{
if(count($consider_path_1)>$high_count)
{
$high_count = count($consider_path_1);
$best_match = implode('/', $consider_path_1);
}
}
array_pop($consider_path_1);
}
array_shift($consider_path_2);
}
$answer = str_replace($best_match, '', $clean_path_1);
echo 'answer: '.$answer."\n";
输出:
answer: /admin/content/edit/2