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

Sta*_*bie 16 php regex url

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

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

Dam*_*mon 21

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

这将做同样的事情:

$str .= (substr($str, -1) == '/' ? '' : '/');
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • $ str = rtrim($ string,'/').'/'; (30认同)

asl*_*rai 14

您可以使用正则表达式,而不是使用正则表达式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;
Run Code Online (Sandbox Code Playgroud)

  • @Col我倾向于总是选择标准的URL解析函数而不是正则表达式,因为1.)作为标准函数,它们应该处理每个可以想象的边缘情况和2.)如果你或同事不是很好,正则表达式会降低可维护性擅长他们(像我一样).但是,一般的正则表达式没有任何问题.您是否看到此解决方案不起作用的情况?如果是的话,你能表现出来吗?我没有看到它 (2认同)

zer*_*kms 5

$url = 'http://www.domain.com';

$need_to_add_trailing_slash = preg_match('~^https?://[^/]+$~', $url);
Run Code Online (Sandbox Code Playgroud)

  • 你也可以这样做: `$url = preg_replace("~^https?://[^/]+$~", "$0/", $url);` (3认同)