2011-08-16 84 views
0

首先對不起我的英文不好。PHP菜單preg_match

我在PHP中有這個菜單欄。我希望如果用戶在頁面上,當前菜單項會獲得另一種顏色。我有一個可行的代碼,但如果我有一個像/item.php?id=9這樣的頁面,它不會工作。所以我嘗試了preg_match,但我無法讓它工作。

菜單:

<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> 

功能getSelected:

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/.*~"; 

,我不知道,但你最好逃避你getSelected呼叫.,因爲使用圖案/itemdphp將匹配了。

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']); 

因爲前面已經有/