【问题标题】:php checking if the last character is a '/' if not then tack it onphp 检查最后一个字符是否为'/',如果不是,则添加它
【发布时间】:2012-02-18 07:55:51
【问题描述】:

我有这 2 个我一直在使用的 sn-ps 代码,但似乎无法让逻辑坚持其中任何一个。

我正在尝试查看给定字符串的末尾是否有'/',如果没有,则添加它。

$path = '.';

if (substr($path, 0, -1) != '/')
    $path .= '/';

if (strrpos('/', $path) !== true)
    $path .= '/';

我遇到的问题是,如果我使 $path 等于 './,那么我将其作为输出 .//

这是我遇到问题的位置

if (!is_array($paths))
    $this->classPath[] = $paths;
else
    $this->classPath = $paths;

foreach ($this->classPath as $path) {

    if (strrpos('/', $path) !== true)// || substr_count($path, '/') >= 0)
        $path = $path . '/';
    //else
        //$this->classPath[] = $path;
        //echo '0';
    $pathArr[] = $path;

【问题讨论】:

  • 您对这两个代码都有这个问题,还是只有后一个代码有这个问题?使用后者有什么意义?
  • 对两者。我试图检测最后一个字符串是否为/ 两者都应该从最后一个字符串迭代,对吗?
  • 我想你想要strrpos('/', $path) !== 0
  • @knittl strrpos 的语法错误,参见php.net/manual/en/function.strrpos.php,如果它是/,它也不会返回0,而是最后一个字符的位置。
  • 你可以使用strpos(strrev($path), '/') !== 0

标签: php


【解决方案1】:

你可能想多了。虽然substr() 方法可以完美运行,但使用rtrim() 删除任何尾部斜杠然后添加一个可能更简单。

$path = rtrim($path, '/') . '/';

注意:这将修剪多个尾部正斜杠。所以.//////变成./

【讨论】:

  • 这正是我的想法。如果需要,修剪右侧并添加斜线。但为什么要投反对票?
  • 建议:改用rtrim($path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR,以保持平台中立。
  • @ChrisBaker 注意使用 DIRECTORY_SEPARATOR 作为 URL,因为它不会输出正确的。
  • 简单优雅的解决方案
【解决方案2】:

我的解决方案:简单甚至可以转换反斜杠,对windows开发者有用:

function fixpath($p) {
    $p=str_replace('\\','/',trim($p));
    return (substr($p,-1)!='/') ? $p.='/' : $p;
}

【讨论】:

    【解决方案3】:

    你可以试试这个功能

        function endsWith($FullStr, $needle)
        {
            $StrLen = strlen($needle);
            $FullStrEnd = substr($FullStr, strlen($FullStr) - $StrLen);
            return $FullStrEnd == $needle;
        }
    

    取自我的blog post

    然后像这样使用它

    if (endsWith($path,'/') == false) 
    {
        $path = $path."/";
    }
    

    如果你不想使用上述函数来简化事情,那么你应该改变你使用 substr 的方式

    获取最后一个字符的正确方法是substr($path,-1)

    【讨论】:

    • 你的脚很好,兄弟!该函数只是简化了substr 函数,因此您不必重新考虑substr 的逻辑。只是为了证明你的观点,你不能那么粗鲁。以上是一个选项。你可以随时使用substr
    • 如果你正在做strlen($FullStr),你还不如做strlen($needle) 并保存一行。或者,如果您愿意,也可以创建两个变量——只要保持一致即可
    【解决方案4】:

    你只是使用 substr 错误。

    要获取最后一个字符,您只需使用负偏移量:substr($path,-1)

    您的代码缺少 2 个基本的东西,这对编程很重要:

    • 调试中
    • 文档阅读。

    调试就像回显变量一样简单。
    通过回显substr($path, 0, -1),您可以让自己意识到您的代码有些错误,通过阅读documentation,您可以看到正确的用法。

    【讨论】:

    • 我已经过了调试阶段,大概 90% 的 stackoverflow 人都是这样,我来这里寻求第二个意见,看看我的逻辑是如何缺乏的。
    • 一个人不会简单地“通过”调试阶段:)
    • “我过去了”什么? “调试阶段”到底是什么?
    • 你一直在调试。你永远不会停止调试,唯一的例外是你的死亡。你永远不能“超过”调试阶段。
    猜你喜欢
    • 2021-06-01
    • 2020-01-27
    • 1970-01-01
    • 2011-02-03
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    相关资源
    最近更新 更多