php - 用另一个字符串的一部分替换字符串的一部分

时间:2011-10-21 18:29:20

标签: php string str-replace

一直在寻找这个,这是我无法弄清楚的。

我想替换以下字符串的粗体部分:

/ 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++;
}

3 个答案:

答案 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