如何使用 strpos($_SERVER['REQUEST_URI'] 从 url 段生成活动类

Posted

技术标签:

【中文标题】如何使用 strpos($_SERVER[\'REQUEST_URI\'] 从 url 段生成活动类【英文标题】:How to use strpos($_SERVER['REQUEST_URI'] to generate active classes from url segments如何使用 strpos($_SERVER['REQUEST_URI'] 从 url 段生成活动类 【发布时间】:2016-04-26 23:38:09 【问题描述】:

我们为此找到了很多答案,但并不完全理解它们(或strpos 手册页),如果已经回答,我们很抱歉。


设置:

考虑以下网址...

http://www.domain.com/whats-on/show-name/   
http://www.domain.com/whats-on/show-name/events

以及我们如何在以下列表项标记中应用 .active 类...

<li>
    <a class="<?= (strpos($_SERVER['REQUEST_URI'], '/whats-on') === 0 ? 'active' : ''); ?>" href="<?= $ShowWhatsOn; ?>">What's on</a>
</li>
<li>
    <a class="<?= (strpos($_SERVER['REQUEST_URI'], '/events') === 0 ? 'active' : ''); ?>" href="<?= $ShowEvents; ?>">Events</a>
</li>

问题:

    What's On 会在 What's On 页面以及事件页面上获取活动类,因为 /whats-on 也在 url 中:/whats-on/show-name/events

    事件从不接收活动类


问题:

    我们如何让 strpos 检查特定的 url 段,以便在正确的页面上应用 .active 类?

我们正在努力使菜单标记保持简短,因此希望有一种方法可以在一行中做到这一点?

任何正确方向的帮助或指示将不胜感激。

干杯

【问题讨论】:

当你想检查/events时尝试检查show-name/events parse_url() @JayBlanchard 非常感谢。我可以看到 php_URL_PATH 将获得路径,但我不明白如何获得路径中的特定段。例如获得第一段或第三段?你必须为此创建自己的函数吗? 【参考方案1】:

函数strpos 为您提供一个字符串(针)在另一个字符串(干草堆)中的位置。所以通过这样做

strpos($_SERVER['REQUEST_URI'], '/whats-on') === 0

您正在检查 REQUEST_URI 是否以“/whats-on”开头(位于位置 0)。由于两个 URL 都以“/whats-on”开头,因此第一项将始终处于活动状态,而第二项则永远不会。

一种解决方法是添加对“/events”的检查:

<li>
    <a class="<?= (strpos($_SERVER['REQUEST_URI'], '/whats-on') === 0 && strpos($_SERVER['REQUEST_URI'], '/events') === false ? 'active' : ''); ?>" href="<?= $ShowWhatsOn; ?>">What's on</a>
</li>
<li>
    <a class="<?= (strpos($_SERVER['REQUEST_URI'], '/whats-on') === 0 && strpos($_SERVER['REQUEST_URI'], '/events') !== false ? 'active' : ''); ?>" href="<?= $ShowEvents; ?>">Events</a>
</li>

虽然这对于您的模板来说有点冗长,但您可能希望将逻辑分解为像 isActive() 这样的函数。

【讨论】:

干杯,将为此创建一个函数【参考方案2】:

好的,为了我将来的参考(和其他人),这就是我解决它的方法。

1。做两个函数

我在我的 CMS 的 /helpers/ 目录中创建了这个并将其命名为 npe_nav.php(如果使用 Concrete5 CMS,请不要将文件命名为 navigation.php,因为该名称由 c5 使用,因此不适用于我)。

// Get URL segments
public function getURLSegments() 
    return explode("/", parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));


// Get a specific URL segment
// Takes a number which corisponds to a segment in the URL e.g. consider:
// http://www.domain.com/whats-on/show-name/events
// $navHelper->getURLSegment(1); will return whats-on
// $navHelper->getURLSegment(3); will return events
public function getURLSegment($n) 
    $segs = $this->getURLSegments();
    return count($segs) > 0 && count($segs) >= ($n-1)?$segs[$n]:'';


2。在模板中加载函数

在 Concrete5 中,我是这样加载的(包名是指该工具在 CMS 中保存的包):

// Load nav helper
$navHelper = Loader::helper('npe_nav','package-name');

3。调用模板中的函数

网址:http://www.domain.com/whats-on/show-name/

这还会在应用 .active 之前检查第三个段是否为空,因为 /whats-on/ 出现在此部分的所有 URL 中 - 所以不希望它在其他页面上处于活动状态。

<li>
    <a class="<?= (($navHelper->getURLSegment(1) == 'whats-on') && (is_null($navHelper->getURLSegment(3))) ? 'active' : ''); ?>" href="<?= $ShowWhatsOn; ?>">What's on</a>
</li>
网址:http://www.domain.com/whats-on/show-name/events

以及第 3 段的其他页面

<li>
    <a class="<?= ($navHelper->getURLSegment(3) == 'events' ? 'active' : ''); ?>" href="<?= $ShowEvents; ?>">Events</a>
</li>

【讨论】:

以上是关于如何使用 strpos($_SERVER['REQUEST_URI'] 从 url 段生成活动类的主要内容,如果未能解决你的问题,请参考以下文章

判定 android IOS

PHP$_SERVER的类型

PHP 判断客户端是IOS还是Android

为啥 strpos 有用/使用,它在这个例子中有啥好处? [关闭]

如何模块化快递应用程序 - 功能,类和req.pipe?

User Agent过滤器有时仅在“ strpos”中起作用