Обрезать только первое и последнее вхождение символа в строку (PHP) - PullRequest
2 голосов
/ 30 сентября 2010

Это то, что я мог бы взломать вместе, но мне было интересно, есть ли у кого-нибудь чистое решение моей проблемы.То, что я бросаю вместе, не обязательно будет очень кратким или быстрым!

У меня есть строка, подобная этой ///hello/world///.Мне нужно удалить только первую и последнюю косую черту, ни одну из остальных, чтобы я получил строку, подобную этой //hello/world//.

PHP's trim не совсем верно: выполнение trim($string, '/')return hello/world.

Следует отметить, что строка не обязательно должна иметь косую черту в начале или конце.Вот несколько примеров того, что я хотел бы случиться с различными строками:

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

Заранее благодарен за любую помощь!

Ответы [ 6 ]

8 голосов
/ 01 октября 2010

Первое, что у меня на уме:

if ($string[0] == '/') $string = substr($string,1);
if ($string[strlen($string)-1] == '/') $string = substr($string,0,strlen($string)-1);
0 голосов
/ 26 мая 2019

Эта функция действует как официальная подстройка, за исключением того, что она обрезается только один раз.

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
0 голосов
/ 12 мая 2017

Это было более 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);
}
0 голосов
/ 01 октября 2010

Еще одна реализация:

function otrim($str, $charlist)
{
 return preg_replace(sprintf('~^%s|%s$~', preg_quote($charlist, '~')), '', $str);
}
0 голосов
/ 01 октября 2010

Другое регулярное выражение с использованием обратных ссылок:

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

Это имеет то преимущество, что, если вы захотите использовать символы, отличные от /, вы можете сделать это более разборчиво.Он также заставляет символ / начинать и заканчивать строку и позволяет / появляться в строке.Наконец, он удаляет персонажа с начала только в том случае, если он тоже есть в конце, и наоборот.

0 голосов
/ 01 октября 2010

Я думаю, это то, что вы ищете:

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