Trim only the first and last occurrence of a chara

2020-07-26 15:24发布

This is something I could hack together, but I wondered if anybody had a clean solution to my problem. Something that I throw together wont necessarily be very concise or speedy!

I have a string like this ///hello/world///. I need to strip only the first and last slash, none of the others, so that I get a string like this //hello/world//.

PHP's trim isn't quite right right: performing trim($string, '/') will return hello/world.

One thing to note is that the string won't necessarily have any slashes at the beginning or end. Here are a few examples of what I would like to happen to different strings:

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

Thanks in advance for any help!

标签: php string trim
6条回答
beautiful°
2楼-- · 2020-07-26 15:25

It has been more than 6 years old ago, but I'm giving may answer anyway:

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);
}
查看更多
家丑人穷心不美
3楼-- · 2020-07-26 15:28

I think this is what you you are looking for:

preg_replace('/\/(\/*[^\/]*?\/*)\//', '\1', $text);
查看更多
手持菜刀,她持情操
4楼-- · 2020-07-26 15:31

A different regex, using backreferences:

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

This has the advantage that, should you want to use characters other than /, you could do so more legibly. It also forces the / character to begin and end the string, and allows / to appear within the string. Finally, it only removes the character from the beginning if there is a character at the end as well, and vice versa.

查看更多
一纸荒年 Trace。
5楼-- · 2020-07-26 15:35

First thing on my mind:

if ($string[0] == '/') $string = substr($string,1);
if ($string[strlen($string)-1] == '/') $string = substr($string,0,strlen($string)-1);
查看更多
beautiful°
6楼-- · 2020-07-26 15:44

Yet another implementation:

function otrim($str, $charlist)
{
 return preg_replace(sprintf('~^%s|%s$~', preg_quote($charlist, '~')), '', $str);
}
查看更多
Melony?
7楼-- · 2020-07-26 15:49

This function acts as the official trim, except that it only trims once.

function trim_once($text, $c) {
    $c = preg_quote($c);
    return preg_replace("#^([$c])?(.*?)([$c])?$#", '$2', $text);
}
php > echo trim_once("||1|2|3|*", "*|");
|1|2|3|
php > echo trim_once("//|1|2|3/", "/");
/|1|2|3
查看更多
登录 后发表回答