php - заменить часть строки частью другой строки - PullRequest
0 голосов
/ 21 октября 2011

искал все вокруг, и вот что я не могу понять.

Я хочу заменить полужирную часть следующей строки:

/ 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 голосов
/ 21 октября 2011

Мне кажется, что вы пытаетесь сопоставить пути , а не строки.Я предполагаю, что вы не захотите, чтобы http://host/foobar совпадало с barcamp/whatever.

Так что я бы рекомендовал разбивать строки на "/".Тогда это просто вопрос перебора массива «http» в поисках первого элемента из массива «path».Если вы найдете совпадение, перейдите ко второму элементу и т. Д. Если два элемента не совпадают, сбросьте их до начала массива «path».Если вы доберетесь до конца массива "http" и последний элемент совпадет, то у вас будет самый длинный общий путь (если нет, то ничего общего не было).

0 голосов
/ 21 октября 2011
$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
0 голосов
/ 21 октября 2011
...