仅修剪字符串中第一个和最后一个字符(PHP)

仅修剪字符串中第一个和最后一个字符(PHP),php,string,trim,Php,String,Trim,这是我可以一起解决的问题,但我想知道是否有人对我的问题有一个干净的解决方案。我拼凑的东西不一定非常简洁或快速 我有这样一个字符串///hello/world//。我只需要去掉第一个和最后一个斜杠,其他的都不需要,这样我就得到一个像这样的字符串//hello/world// PHP的trim不太正确:执行trim($string,“/”)将返回hello/world 需要注意的一点是,字符串的开头或结尾不一定有任何斜杠。以下是我希望对不同字符串执行的几个示例: ///hello/world///

这是我可以一起解决的问题,但我想知道是否有人对我的问题有一个干净的解决方案。我拼凑的东西不一定非常简洁或快速

我有这样一个字符串
///hello/world//
。我只需要去掉第一个和最后一个斜杠,其他的都不需要,这样我就得到一个像这样的字符串
//hello/world//

PHP的
trim
不太正确:执行
trim($string,“/”)
将返回
hello/world

需要注意的一点是,字符串的开头或结尾不一定有任何斜杠。以下是我希望对不同字符串执行的几个示例:

///hello/world/// > //hello/world//
/hello/world/// > hello/world//
hello/world/ > hello/world

提前感谢您的帮助

我想到的第一件事:

if ($string[0] == '/') $string = substr($string,1);
if ($string[strlen($string)-1] == '/') $string = substr($string,0,strlen($string)-1);

我想这就是你想要的:

preg_replace('/\/(\/*[^\/]*?\/*)\//', '\1', $text);

使用反向引用的不同正则表达式:

preg_replace('/^(\/?)(.*)\1$/','\2',$text);

这样做的好处是,如果您想使用/以外的字符,可以更清晰地执行此操作。它还强制/字符开始和结束字符串,并允许/出现在字符串中。最后,如果结尾也有字符,则只从开头删除字符,反之亦然。

另一个实现:

function otrim($str, $charlist)
{
 return preg_replace(sprintf('~^%s|%s$~', preg_quote($charlist, '~')), '', $str);
}

它已经6年多了,但我给出的答案可能是:

function trimOnce($value)
{   
    $offset = 0;
    $length = null;
    if(mb_substr($value,0,1) === '/') {
        $offset = 1;
    }
    if(mb_substr($value,-1) === '/') {
       $length = -1;
    }
    return mb_substr($value,$offset,$length);
}

此功能用作正式修剪,只是只修剪一次

function trim_once($text, $c) {
    $c = preg_quote($c);
    return preg_replace("#^([$c])?(.*?)([$c])?$#", '$2', $text);
}

这个是迄今为止最简单的。它在^/(开始斜杠)和/$(结束斜杠)上匹配,如果找到其中一个,则替换为空字符串。这将适用于任何角色;只需用您选择的字符替换以下正则表达式中的/即可。注意,为了便于阅读,我使用了#而不是/作为分隔符。这将从字符串中删除任何单个first或last/:

$trimmed = preg_replace('#(^/|/$)#', '', $string);
结果:

///hello/world/// > //hello/world//
/hello/world/// > hello/world//
hello/world/ > hello/world

我相信substring方法的运行速度可能比正则表达式快得多。这大概就是我自己想说的。。我想避免使用正则表达式,如果它会变慢,是否有任何统计数据可以支持简单字符串操作函数相对于正则表达式的速度?@Rowan:没有,没有这样的统计数据,因为它非常依赖于正在进行的实际操作,有时候正则表达式确实会赢。唯一的判断方法是根据您期望的字符串对其进行基准测试,即使这样,我也会说,基于性能使用一个而不是另一个可能是微观优化。@Kevin,前提是有数千行这样的代码。好的程序员应该避免这样的数字。太棒了,非常感谢。以前有人警告过我不要进行微优化:)啊,你不能只切换分隔符吗<代码>#/(/*[^/]*?/*)/#。但是,您忘了锚定它:
#^/(/*[^/]*?/*)$/#
,为了有效性起见,您最好使用
preg\u replace(“#(^/|/$)#,”,“$text”)
(^/\/$)
之间的区别在于为什么人们会很快将正则表达式视为不可读。为什么不带一个真实的例子,而不是一个虚拟的例子呢?是否有更好的解决方案,仅针对您的具体情况?这几乎是真实的世界。它是路由类的一部分,该路由类通过当前URL路径路由到相应的控制器。我刚刚注意到
http://example.com/path/to/file
解析为与
http://example.com///path/to/file//
,所以上面的例子几乎就是我得到的字符串的样子:)我在处理路径,但是有这么多斜杠的原因是什么?路径只需要一个。我从未见过这样的路径:
///path/to/file//
。你从哪里得到它们,为什么不正常化,使之成为普通的/path/to/file/?哦,我不想要斜杠。我在考虑非常边缘的情况,比如如果有人输入错误的URL。目前,我正在寻找的功能与配置相关联,因此可以根据应用程序逐个更改行为。也许我想得太多了,但我还是得到了答案,所以我很高兴。我相信有一天我会有另一个用途!这给了我
致命错误:未捕获错误异常:sprintf():参数太少
///hello/world/// > //hello/world//
/hello/world/// > hello/world//
hello/world/ > hello/world