【问题标题】:Breadcrumb menu duplicates link when query string is parsed解析查询字符串时,面包屑菜单重复链接
【发布时间】:2019-10-17 13:19:39
【问题描述】:

我创建了一个面包屑菜单,它获取页面 URL,explodes 每个尾部斜杠(在域之后)之后的文本并将其打印出来。

如果没有向 URL 添加查询字符串,这会正常工作,但是,一旦添加了查询,它就会复制链接:

工作示例:

<?php
    $url = "/parent/child";
    // 1. Get URL
    $crumbs = explode("/", trim($url, '/'));
    // 2. Strip extras
    $build = '';
    // 3. Define int so last item is not a link
    $lastKey = count($crumbs) - 1;
    // 4. Execute loop
    foreach($crumbs as $key => $crumb){
        $build .= '/'.$crumb;
        // format text 
        $crumb = ucfirst(str_replace(array(".php","_"),array(""," "),$crumb) . ' ');
        $crumb = preg_replace('/-/', ' ', $crumb); // remove dashes
        $crumb = trim($crumb); // remove whitespace from before and after string

        $pagename = "child";  

        echo $key < $lastKey
            ? "$crumb /" : $pagename;
    }
?>

以上输出:父/子

这很好。

但是,现在使用查询字符串进行第二个测试(注意$url):

<?php
    $url = "/parent/child/?=query-string";
    // 1. Get URL
    $crumbs = explode("/", trim($url, '/'));
    // 2. Strip extras
    $build = '';
    // 3. Define int so last item is not a link
    $lastKey = count($crumbs) - 1;
    // 4. Execute loop
    foreach($crumbs as $key => $crumb){
        $build .= '/'.$crumb;
        // format text 
        $crumb = ucfirst(str_replace(array(".php","_"),array(""," "),$crumb) . ' ');
        $crumb = preg_replace('/-/', ' ', $crumb); // remove dashes
        $crumb = trim($crumb); // remove whitespace from before and after string

        $pagename = "parent";  

        echo $key < $lastKey
            ? "$crumb   /" : $pagename;
    }
?>

这输出:父/子/父 预期输出:**父/子**

我知道我设置了$pagename = "parent",但我希望它忽略查询字符串。

我尝试了以下方法:

$crumbs = explode("/", trim($_SERVER["REQUEST_URI"], '/'));
$crumbs = preg_replace('/\?.*/', '', $crumbs);

还是一样的结果。

最新代码:

<?php

    // 1. Get current URL
    $crumbs = trim($_SERVER["REQUEST_URI"]);
    $crumbs = preg_replace('/\?.*/', '', $crumbs);
    $crumbs = explode("/", $crumbs);
    array_filter($crumbs);


    $count = count($crumbs);
    $build = '';

    // 3. Define int so last item is not a link
    $lastKey = count($crumbs) - 1;

    // 4. Execute loop
    foreach($crumbs as $key => $crumb){
        $build .= $crumb;

        // format text 
        $crumb = ucfirst(str_replace(array(".php","_"),array(""," "),$crumb) . ' ');
        $crumb = preg_replace('/-/', ' ', $crumb); // remove dashes
        $crumb = trim($crumb); // remove whitespace from before and after string

        $pagename = get_query_var('pagename');  
        $pagename = the_title('', '', false); // print page name as is in WP
        $pagename = preg_replace('/-/', ' ', $pagename); // remove dashes
        $pagename = trim($pagename);

        echo $key < $lastKey
            ? "<a class='crumbLink' href=".$build.">".$crumb."</a>
               <span class='slash'>/</span>"
            : $pagename;

    }


?>

【问题讨论】:

    标签: php regex breadcrumbs


    【解决方案1】:

    我认为问题出在:

    echo $key &lt; $lastKey ? "$crumb /" : $pagename;

    在第 3 步中:

    // 3. Define int so last item is not a link
    $lastKey = count($crumbs) - 1;
    

    如果您有 3 个项目,则 $lastKey 将为 2,因为您计算 3 个项目并减去 1。

    稍后在循环中,最后一项将在 $key = 2 中,所以:

    $key = 2 < $lastKey = 2
    

    【讨论】:

    • 嗯,我进行了一些测试,我也这么认为。有没有办法让它变得动态? IE。我不想将当前页面(面包屑中的最后一项)作为链接并希望它忽略任何查询字符串。我尝试使用正则表达式从 URL $crumbs = preg_replace('/\?.*/', '', $crumbs); 中删除查询,但是我仍然看到相同的结果?
    • @Freddy 如果您不想要查询字符串,可以使用带符号“?”的explode并使用第一个数组作为你的 $crumbs。如果我理解正确的话。
    • 我想要的是 1. 获取 URL,2. 分解该 URL(在每个 / 之后)以获取所有 slug 3. 使所有 slug 链接到那里的页面,除了最后一个 slug (这将是用户所在的当前页面)。问题当然是,当传递一个查询字符串时,它会复制倒数第二个 slug(我不想要)
    【解决方案2】:

    我们如何从 $url 中删除查询字符串。

    <?php
        $url ="/parent/child/";
        $url_arr = parse_url($url);
        if(isset($url_arr['query'])){
        $query = $url_arr['query'];
        $url = str_replace(array($query,'?'), '', $url);
        }
        // 1. Get URL
        $crumbs = explode("/", trim($url, '/'));
        // 2. Strip extras
        $build = '';
        // 3. Define int so last item is not a link
        $lastKey = count($crumbs) - 1;
        // 4. Execute loop
        foreach($crumbs as $key => $crumb){
            $build .= '/'.$crumb;
            // format text
            $crumb = ucfirst(str_replace(array(".php","_"),array(""," "),$crumb) . ' ');
            $crumb = preg_replace('/-/', ' ', $crumb); // remove dashes
            $crumb = trim($crumb); // remove whitespace from before and after string
    
            $pagename = "parent";
    
            echo $key < $lastKey
                ? "$crumb   /" : $pagename;
        }
    ?>
    

    【讨论】:

    • 我试过$url = $_SERVER["REQUEST_URI"]; $url_arr = parse_url($url); $query = $url_arr['query'];但得到Undefined index: query错误?
    • 我已经编辑了帖子,错误出现在没有查询字符串的 URL 上,但现在它可以正常工作了。
    【解决方案3】:

    试试

    $url = parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);
    

    【讨论】:

      【解决方案4】:

      我认为你应该坚持你的第一个“工作”解决方案,但直接使用 parse_url($url, PHP_URL_PATH) 而不是 $url

      <?php
          $url = parse_url("/parent/child?foo=bla&bar=bla", PHP_URL_PATH));
          // 1. Get URL
          $crumbs = explode("/", trim($url, '/'));
          // 2. Strip extras
          $build = '';
          // 3. Define int so last item is not a link
          $lastKey = count($crumbs) - 1;
          // 4. Execute loop
          foreach($crumbs as $key => $crumb){
              $build .= '/'.$crumb;
              // format text 
              $crumb = ucfirst(str_replace(array(".php","_"),array(""," "),$crumb) . ' ');
              $crumb = preg_replace('/-/', ' ', $crumb); // remove dashes
              $crumb = trim($crumb); // remove whitespace from before and after string
      
              $pagename = "child";  
      
              echo $key < $lastKey
                  ? "$crumb /" : $pagename;
          }
      ?>
      

      查看手册中有关parse_url()的更多详细信息: https://www.php.net/manual/en/function.parse-url.php

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-06
        • 2020-05-13
        • 2014-02-12
        • 1970-01-01
        • 2020-04-26
        • 2011-10-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多