PHP меню с preg_match - PullRequest
       10

PHP меню с preg_match

0 голосов
/ 16 августа 2011

Сначала прости за мой плохой английский.

У меня есть эта строка меню в 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?

Спасибо!

Ответы [ 5 ]

2 голосов
/ 16 августа 2011

Я думаю, что 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>

Здесь нет необходимости в RegEx.

0 голосов
/ 16 августа 2011

Вы можете использовать что-то вроде

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

Потому что у вас уже есть / спереди.

0 голосов
/ 16 августа 2011

Это может быть трейлинг / в $pattern. Попробуйте заменить

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

с

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

Кроме того, я не уверен, но вам лучше избегать . в ваших getSelected вызовах, потому что с вашим шаблоном /itemdphp тоже будет соответствовать.

0 голосов
/ 16 августа 2011

Во-первых, нет причины сбрасывать переменную столько раз. Просто сделайте это один раз в начале:

<?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 голосов
/ 16 августа 2011

В этой ситуации проще (циклы ЦП) и проще (кодирование) просто использовать функцию строки php.

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