繁体   English   中英

PHP:如何向绝对URL添加尾部斜杠

[英]PHP: how to add trailing slash to absolute URL

我有一个绝对URL列表。 我需要确保它们都有斜杠,如果适用的话。 所以:

我猜我需要使用正则表达式,但匹配的URL很痛苦。 希望有一个更简单的解决方案。 想法?

对于这个非常具体的问题,根本不使用正则表达式也可能是一个选项。 如果您的列表很长(几千个URL)并且时间有任何问题,您可以选择手动编码这个非常简单的操作。

这将做同样的事情:

$str .= (substr($str, -1) == '/' ? '' : '/');

它当然不像正则表达式那样优雅或灵活,但它避免了解析正则表达式字符串的开销,并且它将以PHP能够执行的速度运行。
它可以说比正则表达式更不易读,虽然这取决于读者对正则表达式语法的舒适程度(有些人可能会觉得它更具可读性)。

它肯定不会检查字符串是否是一个格式正确的URL(例如zerkms的正则表达式),但你已经知道你的字符串仍然是URL,所以这有点多余。

但是,如果您的列表类似于10或20个URL,请忘记这篇文章。 使用正则表达式,差异将为零。

您可以使用parse_url()来执行此操作,而不是使用正则表达式执行此操作。 例如:

$url = parse_url("http://www.example.com/ab/abc.html?a=b#xyz");
if(!isset($url['path'])) $url['path'] = '/';
$surl = $url['scheme']."://".$url['host'].$url['path'].'?'.$url['query'].'#'.$url['fragment'];
echo $surl;
$url = 'http://www.domain.com';

$need_to_add_trailing_slash = preg_match('~^https?://[^/]+$~', $url);

这可能不是最优雅的解决方案,但它就像一个魅力。 首先我们得到完整的URL,然后检查它是否有一个尾随斜杠。 如果没有,请检查是否没有查询字符串,它不是实际文件,也不是实际目录。 如果网址满足所有这些条件,我们会执行301重定向并添加尾部斜杠。

如果您不熟悉PHP标头...请注意,在此代码之前不能有任何输出 - 甚至不是空格。

$url = $_SERVER['REQUEST_URI'];
$lastchar = substr( $url, -1 );
if ( $lastchar != '/' ):
    if ( !$_SERVER['QUERY_STRING'] and !is_file( $_SERVER['DOCUMENT_ROOT'].$url ) and     !is_dir( $_SERVER['DOCUMENT_ROOT'].$url ) ):
        header("HTTP/1.1 301 Moved Permanently");
        header( "Location: $url/" );
    endif;
endif;

试试这个:

if (!preg_match("/.*\/$/", $url)) {

     $url = "$url" . "/";
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM