3

訪問者の現在のページに基づいて、メイン メニュー バーのリンクを動的にしようとしています。

私はから始めました

 $path = $_SERVER['REQUEST_URI'];

もちろん、これは次のようなものを返します

  • /サブフォルダー/page.html
  • /subfolder1/subfolder2/page.html
  • /page.html

最初の「/」の後にあるものをすべて取得する必要があります。私は爆発をいじってみましたが、結果の配列をどうするかでつまずきました。私はまた、正規表現を書こうとして目がくらむつもりです-よりエレガントな解決策のようです。

次に、スイッチを作成する必要があります。次のようなもの:

switch ($path)
{
case '/subfolder0':
  $link = $root_url.'/subfolder0/anotherfolder/page.html';
  break;
case '/subfolder1':
  $link = $root_url.'/subfolder1/page.html';
  break;
default:
  $link = $root_url.'/subfolder2/page.html';
}

最後に、スイッチの代わりに if...elseif を使用する必要がありますか?

お時間をいただきありがとうございます。

4

4 に答える 4

2

最初の / の後のすべてを取得するには:

strstr($_SERVER['REQUEST_URI'], '/');

または、正規表現で:

preg_match('#(/.*)#', $_SERVER['REQUEST_URI'], $matches);  // $matches[1] will be the path

スイッチに関しては、あなたのケースで /elseif/else が最もエレガントでない場合、スイッチは悪くありませんが、個人的には連想配列を使用します。

$mapping = array('/subfolder0' => $root_url.'/subfolder0/anotherfolder/page.html', 'etc' => 'etc');
$link = $mapping($path);

これにより、マッピングを整理用に別のファイルに保持でき、構成と実装を分離することで保守が少し簡単になります。

于 2013-04-02T16:31:56.790 に答える
1

OPの質問を分析した後、彼/彼女はそれを「最初の「/」の後、2番目の「/」の前のすべて」と表現するつもりだったと思います。これが私が得たものです:

この正規表現を試すことができます:

<?php

/*
 *  Regex: /((\w+?|\w+\.\w+?)(?!^\/))(?=\/.*$|$)/
 */

$paths = array(
    '/subfolder9/',
    '/subfolder/page.html',
    '/subfolder1/subfolder2/page.html',
    '/page.html'
);

foreach ($paths as $path) {
    preg_match("/((\w+?|\w+\.\w+?)(?!^\/))(?=\/.*$|$)/", $path, $matches);
    debug($matches);
}

// $matches[1] will contain the first group ( ) matched in the expression.
// or "subfolder<#>" or "<page>.<ext>"

// The loop results is as follows:
Array
(
    [0] => subfolder9
    [1] => subfolder9
    [2] => subfolder9
)

Array
(
    [0] => subfolder
    [1] => subfolder
    [2] => subfolder
)

Array
(
    [0] => subfolder1
    [1] => subfolder1
    [2] => subfolder1
)

Array
(
    [0] => page.html
    [1] => page.html
    [2] => page.html
)

?>

注: これは、ルックアラウンドをサポートする正規表現フレーバーでのみ機能します (ゼロ幅の正と負の先読みは、例で使用されているものです)。

これは正規表現のすばらしいチート シートであり、これなしではコーディングしません。

Regular-Expressions.info - (クリックして表示)

于 2013-04-02T16:38:38.713 に答える