私の URL がwww.example.com/usa/california/redding/だとします。
以下を返す最も効率的な方法は何ですか:
$urls = array ( 0 => '/usa/', 1 => '/usa/california/', 2 => '/usa/california/redding/' );
実際の URL は不明であり、セグメントの長さ/数も不明です。
私の URL がwww.example.com/usa/california/redding/だとします。
以下を返す最も効率的な方法は何ですか:
$urls = array ( 0 => '/usa/', 1 => '/usa/california/', 2 => '/usa/california/redding/' );
実際の URL は不明であり、セグメントの長さ/数も不明です。
あまりエレガントではありませんが、これで仕事は完了です。
<?php
$link = 'www.example.com/usa/california/redding/';
$parts = explode('/',$link);
$results = array();
for ($i = 1; $i < count($parts) - 1; $i++) {
$results[] = '/'.implode('/', array_slice($parts, 1,$i)).'/';
}
print_r($results);
?>
これを行う最も効率的な方法は、文字列をループし、連続する各 / 文字を調べてから、それらを配列にプッシュすることです。このアルゴリズムは、文字列連結も O(n) であると仮定すると、O(n) になります。
$url = "www.example.com/usa/california/redding/";
$next = "";
$urls = array();
// we use the strpos function to get position of the first /
// this let's us ignore the host part of the url
$start = strpos($url, "/");
// just in case PHP uses C strings or something (doubtful)
$length = strlen($url);
// loop over the string, taking one character at a time
for ($i = $start; $i < $length; $i++) {
// append the character to our temp string
$next .= $url[$i];
// skip the first slash, but after that push the value of
// next onto the array every time we see a slash
if ($i > $start && $url[$i] == "/") {
array_push($urls, $next);
}
}
を使用するのregular expression
は最初ですが、そうではないかもしれませんefficient
:
$str = 'www.example.com/usa/california/redding/';
$patten = '/(((\/.[0-9A-Za-z]+\/).[0-9A-Za-z]+\/).[0-9A-Za-z]+\/)/';
$ret = preg_match($patten, $str, $matches);
var_export($matches);
出力は次のようになります。
array (
0 => '/usa/california/redding/',
1 => '/usa/california/redding/',
2 => '/usa/california/',
3 => '/usa/',
)
最初は試合全体、残り3つはキャプチャです。