面包屑菜单PHP生成额外的空白锚链接
假设我有以下URL:面包屑菜单PHP生成额外的空白锚链接,php,html,breadcrumbs,Php,Html,Breadcrumbs,假设我有以下URL: https://site.website/products/products-level-2 在products-level-2上,我有一个面包屑英雄部分。我希望看到的是: 产品/产品级别2 然而,根据我目前的方法,我看到: /Products/Products Level 2/ ^^上面有以下HTML输出: / / / / 解决方案: 最终的工作代码如下所示: <?php // 1. Get URL $crumbs = explode("/",$_SER
https://site.website/products/products-level-2
在products-level-2
上,我有一个面包屑英雄部分。我希望看到的是:
产品/产品级别2
然而,根据我目前的方法,我看到:
/Products/Products Level 2/
^^上面有以下HTML输出:
/
/
/
/
解决方案:
最终的工作代码如下所示:
<?php
// 1. Get URL
$crumbs = explode("/",$_SERVER["REQUEST_URI"]);
array_filter($crumbs);
$count = count($crumbs);
$address = $_SERVER['HTTP_HOST'];
// 2. Strip extras
$build = '';
$i = 0;
foreach($crumbs as $crumb) {
$href = (++$i != $count ? 'href="' . $address . $build . '"' : '');
$build .= '/'.$crumb;
$crumb = ucfirst(str_replace(array(".php","_"),array(""," "),$crumb) . ' ');
echo
"<a class='crumbMenu' " . $href . ">".$crumb."</a>
<span class='slash'>/</span> ";
}
?>
2。在href中,它输出double//(即site.website//products)
之所以发生这种情况,是因为它首先迭代数组中的空白元素,因为默认情况下添加了一个前斜杠,第二个循环已经存在一个前斜杠,因此它会加倍。
问题1的解决方案解决了这个问题 3。我也不希望最后一项(即产品级别2)成为链接(因为用户正在该页面上查看面包屑)。 在$crumbs
上运行array\u filter
后,您需要使用以下方法计算数组中的元素数:
$count = count($crumbs);
然后,当您在阵列中循环时,您需要在循环是阵列的最后一个循环时进行训练:
$i = 0;
foreach($crumbs as $crumb) {
$href = (++$i != $count ? 'href="' . $address . $build . '"' : '');
// ...rest of foreach
$build .= '/' . $crumb;
$crumb = ucfirst(str_replace(array(".php","_"),array(""," "),$crumb) . ' ');
echo "<a class='crumbMenu' " . $href . ">".$crumb."</a><span class='slash'>/</span> ";
}
$i=0;
foreach($crumps as$crump){
$href=(++$i!=$count?href=“”.$address.$build.”“:”);
//…foreach的其余部分
$build.='/'.$crumb;
$crumb=ucfirst(str_替换(数组(“.php”、“”)、数组(“、”)、$crumb)。”;
回声“/”;
}
4。我不想/出现在面包屑的开头和结尾。
这一问题已通过我对您的第一个问题的解决方案得到解决,该解决方案位于此答案的顶部。解决方案:
/* A character used as a divider between the breadcrumbs */
$separator = ' / ';
/* The current page uri from which to build breadcrumb trail */
$uri='https://'.$_SERVER['HTTP_HOST'].'/products/computers/microsoft/laptops/acer/professional';
/* capture the path and explode to create an array - removing empty entries in the process */
$crumbs=array_filter( explode( '/', parse_url( $uri, PHP_URL_PATH ) ) );
/* The host and protocol for building correct links */
$host=sprintf( '%s://%s/', parse_url( $uri, PHP_URL_SCHEME ), parse_url( $uri, PHP_URL_HOST ) );
/* placeholder array to store generated links */
$html=[];
/* iterate through the array and build relevant HTML content - append to output array */
foreach( $crumbs as $index => $crumb ){
/* tweak the text displayed */
$crumb = ucfirst( str_replace( array( ".php", "_" ), array( "", " " ), $crumb ) );
/* the path should be all the previous breadcrumb crumbs */
$path=[];
for( $i=1; $i < $index; $i++ ) $path[]=$crumbs[ $i ];
$path=implode( DIRECTORY_SEPARATOR, $path );
/* create the link used in the html display */
$html[]= ( $index==count( $crumbs ) ) ? sprintf('<span>%s</span>', $crumb ) : sprintf("<a href='%s%s' class='crumbMenu'>%s</a>", $host, $path, $crumb );
}
echo $uri, "
<style>
#breadcrumbs{border:1px solid gray;padding:1rem;font-family:calibri,verdana,arial}
#breadcrumbs *{padding:1rem;}
#breadcrumbs a,
#breadcrumbs span:hover{color:blue}
#breadcrumbs a:hover{color:red;}
#breadcrumbs span{font-weight:bolder;}
</style>
<div id='breadcrumbs'>",
implode( $separator, $html ),
"</div>";
最终的工作代码如下所示:
<?php
// 1. Get URL
$crumbs = explode("/",$_SERVER["REQUEST_URI"]);
array_filter($crumbs);
$count = count($crumbs);
$address = $_SERVER['HTTP_HOST'];
// 2. Strip extras
$build = '';
$i = 0;
foreach($crumbs as $crumb) {
$href = (++$i != $count ? 'href="' . $address . $build . '"' : '');
$build .= '/'.$crumb;
$crumb = ucfirst(str_replace(array(".php","_"),array(""," "),$crumb) . ' ');
echo
"<a class='crumbMenu' " . $href . ">".$crumb."</a>
<span class='slash'>/</span> ";
}
?>
2。在href中,它输出double//(即site.website//products)
之所以发生这种情况,是因为它首先迭代数组中的空白元素,因为默认情况下添加了一个前斜杠,第二个循环已经存在一个前斜杠,因此它会加倍。
问题1的解决方案解决了这个问题 3。我也不希望最后一项(即产品级别2)成为链接(因为用户正在该页面上查看面包屑)。 在$crumbs
上运行array\u filter
后,您需要使用以下方法计算数组中的元素数:
$count = count($crumbs);
然后,当您在阵列中循环时,您需要在循环是阵列的最后一个循环时进行训练:
$i = 0;
foreach($crumbs as $crumb) {
$href = (++$i != $count ? 'href="' . $address . $build . '"' : '');
// ...rest of foreach
$build .= '/' . $crumb;
$crumb = ucfirst(str_replace(array(".php","_"),array(""," "),$crumb) . ' ');
echo "<a class='crumbMenu' " . $href . ">".$crumb."</a><span class='slash'>/</span> ";
}
$i=0;
foreach($crumps as$crump){
$href=(++$i!=$count?href=“”.$address.$build.”“:”);
//…foreach的其余部分
$build.='/'.$crumb;
$crumb=ucfirst(str_替换(数组(“.php”、“”)、数组(“、”)、$crumb)。”;
回声“/”;
}
4。我不想/出现在面包屑的开头和结尾。
我对第一个问题的解答就在这个答案的顶部,解决了这个问题。/*用作面包屑之间分隔符的字符*/
/* A character used as a divider between the breadcrumbs */
$separator = ' / ';
/* The current page uri from which to build breadcrumb trail */
$uri='https://'.$_SERVER['HTTP_HOST'].'/products/computers/microsoft/laptops/acer/professional';
/* capture the path and explode to create an array - removing empty entries in the process */
$crumbs=array_filter( explode( '/', parse_url( $uri, PHP_URL_PATH ) ) );
/* The host and protocol for building correct links */
$host=sprintf( '%s://%s/', parse_url( $uri, PHP_URL_SCHEME ), parse_url( $uri, PHP_URL_HOST ) );
/* placeholder array to store generated links */
$html=[];
/* iterate through the array and build relevant HTML content - append to output array */
foreach( $crumbs as $index => $crumb ){
/* tweak the text displayed */
$crumb = ucfirst( str_replace( array( ".php", "_" ), array( "", " " ), $crumb ) );
/* the path should be all the previous breadcrumb crumbs */
$path=[];
for( $i=1; $i < $index; $i++ ) $path[]=$crumbs[ $i ];
$path=implode( DIRECTORY_SEPARATOR, $path );
/* create the link used in the html display */
$html[]= ( $index==count( $crumbs ) ) ? sprintf('<span>%s</span>', $crumb ) : sprintf("<a href='%s%s' class='crumbMenu'>%s</a>", $host, $path, $crumb );
}
echo $uri, "
<style>
#breadcrumbs{border:1px solid gray;padding:1rem;font-family:calibri,verdana,arial}
#breadcrumbs *{padding:1rem;}
#breadcrumbs a,
#breadcrumbs span:hover{color:blue}
#breadcrumbs a:hover{color:red;}
#breadcrumbs span{font-weight:bolder;}
</style>
<div id='breadcrumbs'>",
implode( $separator, $html ),
"</div>";
$separator='/';
/*要从中构建面包屑线索的当前页面uri*/
$uri='https://'.$\u服务器['HTTP\u主机]./products/computers/microsoft/laptops/acer/professional';
/*捕获路径并分解以创建数组-删除流程中的空条目*/
$crumps=array_filter(分解('/',解析_url($uri,PHP_url_PATH));
/*用于建立正确链接的主机和协议*/
$host=sprintf(“%s://%s/”,parse_url($uri,PHP_url_方案),parse_url($uri,PHP_url_host));
/*用于存储生成链接的占位符数组*/
$html=[];
/*迭代数组并构建相关的HTML内容-附加到输出数组*/
foreach($crumps as$index=>$crump){
/*调整显示的文本*/
$crumb=ucfirst(str_替换(数组(“.php”、“”)、数组(“、”)、$crumb));
/*路径应该是所有以前的面包屑屑*/
$path=[];
对于($i=1;$i<$index;$i++)$path[]=$crumbs[$i];
$path=内爆(目录分隔符,$path);
/*创建html显示中使用的链接*/
$html[]=($index==count($crumps))?sprintf(“%s”,$crump):sprintf(“,$host,$path,$crump);
}
echo$uri,“
#面包屑{边框:1px纯灰;填充:1rem;字体系列:calibri、verdana、arial}
#面包屑*{padding:1rem;}
#面包屑a,
#面包屑跨距:悬停{颜色:蓝色}
#面包屑a:悬停{颜色:红色;}
#面包屑跨距{font-weight:bold;}
",
内爆($separator,$html),
"";
/*用作面包屑之间分隔符的字符*/
$separator='/';
/*要从中构建面包屑线索的当前页面uri*/
$uri='https://'.$\u服务器['HTTP\u主机]./products/computers/microsoft/laptops/acer/professional';
/*捕获路径并分解以创建数组-删除流程中的空条目*/
$crumps=array_filter(分解('/',解析_url($uri,PHP_url_PATH));
/*用于建立正确链接的主机和协议*/
$host=sprintf(“%s://%s/”,parse_url($uri,PHP_url_方案),parse_url($uri,PHP_url_host));
/*用于存储生成链接的占位符数组*/
$html=[];
/*迭代数组并构建相关的HTML内容-附加到输出数组*/
foreach($crumps as$index=>$crump){
/*调整显示的文本*/
$crumb=ucfirst(str_替换(数组(“.php”、“”)、数组(“、”)、$crumb));
/*路径应该是所有以前的面包屑屑*/
$path=[];
对于($i=1;$i<$index;$i++)$path[]=$crumbs[$i];
$path=内爆(目录分隔符,$path);
/*创建html显示中使用的链接*/
$html[]=($index==count($crumps))?sprintf(“%s”,$crump):sprintf(“,$host,$path,$crump);
}
echo$uri,“
#面包屑{边框:1px纯灰;填充:1rem;字体系列:calibri、verdana、arial}
#面包屑*{padding:1rem;}
#面包屑a,