2011-08-16 19 views
0

私の悪い英語の申し訳ありません。preg_matchを使用したPHPメニュー

私はPHPでこのメニューバーを持っています。私は、ユーザーがページ上にいる場合、現在のメニュー項目が別の色を取得したいと考えています。私は動作するコードを持っていたが、もし私が/item.php?id=9のようなページを持っていれば、それはうまくいかなかった。だから、私はpreg_matchでこれを試しましたが、うまく動作しません。

メニュー:getSelected

<li <?php unset($pageURL); getSelected("/index.php") ?>><a href="index.php">Home</a></li> 
<li <?php unset($pageURL); getSelected("/item.php") ?>><a href="item.php">Item</a></li> 
<li <?php unset($pageURL); getSelected("/more.php") ?>><a href="more.php">More</a></li> 

が機能:

Function getSelected($nameURL){ 
$curURL =$_SERVER["REQUEST_URI"]; 
$pattern = "~$nameURL/.*~"; 
    if(preg_match($pattern, $curURL)){ 
     echo 'class="selected"'; 
     unset($curURL); 
    } 
    unset($curURL); 
} 

私はするpreg_matchでこれを解決することができますか?

ありがとうございました!

+0

ちょっとしたコーディングアドバイス:PHPが自動的に関数変数を処理するので、関数変数の設定を解除する必要はありません。メンテナンスコストが増加するだけです。また、関数名は、あなたが何も印刷していないので誤解を招きます。 – matthewdaniel

答えて

2

basename()と組み合わせてparse_url()とすると仕事をすると思います。これは、URLのファイル名を返しません:

function getSelected($nameURL){ 
    $currentfile = basename(parse_url($_SERVER['REQUEST_URI'],PHP_URL_PATH)); 
    if($currentfile === $nameURL){ 
     echo 'class="selected"'; 
    } 
} 

そしてHTMLで例えば:

<li <?php getSelected("item.php") ?>><a href="item.php">Item</a></li> 

ここで正規表現の必要はありません。

0

この状況では、PHP文字列関数を使用する方が高速(CPUサイクル)で簡単です(コーディング)。

if (stripos($curURL, $pattern) !== false) { 
    echo 'class="selected"' 
} 
0

それは$patternの末尾/かもしれません。また

$pattern = "~$nameURL/?.*~"; 

$pattern = "~$nameURL/.*~"; 

を交換してみてください、私はわからないんだけど、自分のパターンで/itemdphpがあまりにもマッチしますので、あなたは、より良い、あなたのgetSelected呼び出しで.を脱出したいです。

0

まず、変数を何度も設定解除する理由はありません。ただ、冒頭で一度、それを実行します。次に

<?php unset($pageURL);?> 
<li <?php getSelected("/index.php") ?>><a href="index.php">Home</a></li> 
<li <?php getSelected("/item.php") ?>><a href="item.php">Item</a></li> 
<li <?php getSelected("/more.php") ?>><a href="more.php">More</a></li> 

あなたの関数で、次の正規表現を試してみてください。

$pattern = "/\/$nameURL(.*)/";

getSelected('item.php')は、例えば、あなたが使用することができます/item.phpまたは/item.php?something=stuff&othervar=lollipop

0

と一致します何かのように

$pattern = $nameURL . '$/'; 
preg_match($pattern, $_SERVER['SCRIPT_FILENAME']); 

すでに前面に/があるためです。