Выделение подстроки PHP. Получить строку перед первой '/' или всей строкой

Я пытаюсь извлечь подстроку. Мне нужна помощь в выполнении этого в PHP.

Вот некоторые примеры строк, с которыми я работаю, и результаты, которые мне нужны:

home/cat1/subcat2 => home

test/cat2 => test

startpage => startpage

Я хочу получить строку до первого /, но если нет /, получите всю строку.

Я пробовал,

substr($mystring, 0, strpos($mystring, '/'))

Я думаю, что это говорит - получить позицию /, а затем получить подстроку из позиции 0 в эту позицию.

Я не знаю, как обрабатывать случай, когда нет /, не делая слишком большого выражения.

Есть ли способ обработать этот случай, не делая слишком сложным выражение PHP?

Ответ 1

Используйте explode()

$arr = explode("/", $string, 2);
$first = $arr[0];

В этом случае я использую параметр limit для explode, так что php не будет сканировать строку больше, чем нужно.

Ответ 2

наиболее эффективное решение - strtok:

strtok($mystring, '/')

Например:

$mystring = 'home/cat1/subcat2/';
$first = strtok($mystring, '/');
echo $first; // home

и

$mystring = 'home';
$first = strtok($mystring, '/');
echo $first; // home

Ответ 3

$first = explode("/", $string)[0];

Ответ 4

Как насчет этого:

substr($mystring.'/', 0, strpos($mystring, '/'))

Просто добавьте '/' в конец mystring, чтобы вы могли быть уверены, что есть хотя бы один;)

Ответ 5

Это, наверное, самый короткий пример, который пришел мне на ум:

list($first) = explode("/", $mystring);

1) list() будет автоматически назначать строку до "/", если обнаружен разделитель
2) если разделитель "/" не найден, вся строка будет назначена

... и если вы действительно одержимы производительностью, вы можете добавить дополнительный параметр для взорвания explode("/", $mystring, 2), который ограничивает максимум возвращаемых элементов.

Ответ 6

Функция strstr() в PHP 5.3 должна выполнять эту работу. Однако для третьего параметра должно быть установлено значение true.

Но если вы не используете 5.3, то нижеприведенная функция должна работать точно:

function strbstr( $str, $char, $start=0 ){
    if ( isset($str[ $start ]) && $str[$start]!=$char ){
        return $str[$start].strbstr( $str, $char, $start+1 );
    }
}

Я не тестировал его, но это должно работать нормально... И это довольно быстро, как и

Ответ 7

Однострочная версия принятого ответа:

$out=explode("/", $mystring, 2)[0];

Должен работать в php 5.4 +

Ответ 8

Позднее лучше, чем никогда. Для этого php имеет предопределенную функцию. вот хороший способ.

strstr

если вы хотите получить часть перед матчем, просто установите before_needle (третий параметр) на true http://php.net/manual/en/function.strstr.php

function not_strtok($string, $delimiter)
{    
    $buffer = strstr($string, $delimiter, true);

    if (false === $buffer) {
        return $string;
    }

    return $buffer;
}

var_dump(
    not_strtok('st/art/page', '/')
);

Ответ 9

Вы можете попробовать использовать регулярное выражение следующим образом:

$s = preg_replace('|/.*$|', '', $s);

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

Ответ 10

Использование current on explode облегчит процесс.

 $str = current(explode("/", $str, 2));

Ответ 11

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

/**
 * Return string before needle if it exists.
 *
 * @param string $str
 * @param mixed $needle
 * @return string
 */
function str_before($str, $needle)
{
    $pos = strpos($str, $needle);

    return ($pos !== false) ? substr($str, 0, $pos) : $str;
}

Здесь используется прецедент:

$sing = 'My name is Luka. I live on the second floor.';

echo str_before($sing, '.'); // My name is Luka

Ответ 12

$string="kalion/home/public_html";

$newstring=( stristr($string,"/")==FALSE ) ? $string : substr($string,0,stripos($string,"/"));

Ответ 13

Я думаю, что это должно работать?

substr($mystring, 0, (($pos = (strpos($mystring, '/') !== false)) ? $pos : strlen($mystring)));

Ответ 14

почему бы не использовать:

function getwhatiwant($s)
{
    $delimiter='/';
    $x=strstr($s,$delimiter,true);
    return ($x?$x:$s);
}

ИЛИ

   function getwhatiwant($s)
   {
       $delimiter='/';
       $t=explode($delimiter, $s);
       return ($t[1]?$t[0]:$s);
   }