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

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

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

home/cat1/subcat2 => home test/cat2 => test startpage => startpage 

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

Я пытался,

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

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

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

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

Использовать explode()

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

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

Наиболее эффективным решением является функция strtok :

 strtok($mystring, '/') 

Например:

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

а также

 $mystring = 'home'; $first = strtok($mystring, '/'); echo $first; // home 
 $first = explode("/", $string)[0]; 

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

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

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

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

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

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

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

Функция 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 ); } } 

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

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

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

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

Лучше поздно, чем никогда. Для этого 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', '/') ); 

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

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

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

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

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

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

 /** * 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 
 $string="kalion/home/public_html"; $newstring=( stristr($string,"/")==FALSE ) ? $string : substr($string,0,stripos($string,"/")); 

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

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

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

 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); }