我有一份绝对路径URL列表,需要确保它们都有适当的尾随斜杠。
- http://www.domain.com/ <-- 不需要尾随斜杠
- http://www.domain.com <-- 需要尾随斜杠
- http://www.domain.com/index.php <-- 不需要尾随斜杠
- http://www.domain.com/?message=hello <-- 不需要尾随斜杠
我猜我需要使用正则表达式,但匹配URL非常麻烦。希望有更简单的解决方案。有什么想法?
我有一份绝对路径URL列表,需要确保它们都有适当的尾随斜杠。
我猜我需要使用正则表达式,但匹配URL非常麻烦。希望有更简单的解决方案。有什么想法?
对于这个非常具体的问题,也可以考虑不使用正则表达式。如果你的列表很长(有几千个URL),时间很重要,那么你可以选择手动编写这个非常简单的操作。
这样做也能达到同样的效果:
$str .= (substr($str, -1) == '/' ? '' : '/');
这种方法当然远不如正则表达式那样优雅和灵活,但它避免了解析正则表达式字符串的开销,并且运行速度与 PHP 的能力一样快。
虽然这取决于读者对正则表达式语法的熟悉程度(有些人可能会觉得更易读),但可以说它比正则表达式可读性差。
它肯定不会检查字符串是否真的是一个格式正确的 URL(例如zerkms的正则表达式),但你已经知道你的字符串是 URL,所以这有点多余。
尽管如此,如果您的列表只有10到20个URL之类的数量,那么请忘掉这篇文章。使用正则表达式,两者的差别将为零。
preg_...
是完全不优雅的。顺便说一下,谈到优雅:@Vino 的“smartlet”可能是这个页面上最酷的东西,干得好! :) - Sz.你可以使用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;
(\w+\.)\w+
更复杂...实际上,我并不完全理解这个问题的基础,为什么要添加斜杠呢? - Kobi php > $url = parse_url("http://www.example.com"); php > if(!isset($url['path'])) $url['path'] = '/'; php > $surl = $url['scheme']."://".$url['host'].$url['path'].'?'.$url['query'].'#'.$url['fragment']; php > echo $surl; http://www.example.com/?#
- Yuda Prawira$url = 'http://www.domain.com';
$need_to_add_trailing_slash = preg_match('~^https?://[^/]+$~', $url);
$url = preg_replace("~^https?://[^/]+$~", "$0/", $url);
- Kobi这可能不是最优雅的解决方案,但它非常有效。首先我们获取完整的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;
substr
的做法是可以的,但你应该只在脚本中需要它的变量上加上尾部斜杠,而不是重定向用户。 - Chris Baker试试这个:
if (!preg_match("/.*\/$/", $url)) {
$url = "$url" . "/";
}
.*
是冗余的,如果选择不同的分隔符,就可以避免转义/
。 - Matteo Riva
http://www.domain.com?message=hello
怎么样? - Kobiwww.domain.com
)之后,可选查询或片段之前。 - Gumbo