1

我有一个字符串(url路径),例如/recipes/cheese/cheese-meat-loaf,我有一个巨大的路径数组,例如

'/recipes/',
'/content/'
...

我想走我的路径并在数组中找到与路径的一部分匹配的路径。所以对于这个例子,它会/recipes/在数组中匹配,因为路径包含/recipes/,但数组也可能包含/recipes/cheese/在这种情况下它应该匹配它。

所以几乎我想通过路径减去之间的所有内容/并尝试匹配它......所以它会做

`/recipes/cheese/cheese-meat-loaf` then if not found
`/recipes/cheese/` then if not found
`/recipes/` then if not found
return default

它将返回巨型数组中的值(键是路径)。

我希望它倒退,因为我只想要一个值,并且可能有多个/recipes/*/

但我不确定该怎么做。

4

4 回答 4

2

由于我们不是来为您编写代码的,所以让我为您编写一个“食谱”,让您自己编写代码。然后,如果您在此过程中遇到问题,您可以回到这里提出更具体的问题,我们可以更好地帮助您。

  1. 在您的数组中搜索当前的搜索字符串
  2. 如果找到,则返回数组中的值
  3. 如果您还没有找到它,请在搜索字符串中搜索最后一次出现的斜杠字符,然后将其连同其后的所有内容一起删除
  4. 使用新的搜索字符串从 1 重新开始
于 2012-10-29T14:12:26.793 回答
0

尝试通过切断最后一个 / 并使用该值在您的数组中搜索来缩短您的 URL:

$arr = array([with many elements]);
$url = '/recipes/cheese/cheese-meat-loaf';
$found = false;
while ($found === false && $url !== '') {
  if (in_array($url, $arr)) $found = $url;
  else {
    $shorten = preg_replace('/(\/[^\/]*)$/', '', $url);
    if ($shorten === $url) break;
    else $url = $shorten;
  }
}
echo $found !== false ? 'found: ' . $url : 'not found';

活生生的例子

于 2012-10-29T14:11:06.360 回答
0

PHP中有一个函数explode可以将字符串分解成碎片。 explode("/",$inputstring)将返回一个数组。例如:

explode("/",'/recipes/cheese/cheese-meat-loaf');

array(
    [0]=>"recipies"
    [1]=>"cheese"
    [2]=>"cheese-meat-loaf"
)

你也可以爆炸cheese-meat-loaf

于 2012-10-29T14:11:47.890 回答
0

对路径数组进行排序,以使最长的路径排在第一位。然后通过并返回第一场比赛:

$array = array(
    '/recipies',
    '/recipies/cheese'
    );

$url = "/recipies/cheese/fondue";

function lsort($a,$b){
    $diff = strlen($b) - strlen($a);
    return $diff;
}

usort($array,'lsort');

foreach( $array as $path ){
    echo "Testing $path<br/>";
    if( !strncmp($url, $path, strlen($path)) ){    
       echo "Best match is $path</br/>";
       break;
    }
}

样本输出:

Testing /recipies/cheese
Best match is /recipies/cheese
于 2012-10-29T16:40:17.460 回答