[英]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.