Извлечение подстроки PHP. Получить строку перед первой ' / ' или всю строку
Я пытаюсь извлечь подстроку. Мне нужна помощь с этим в PHP.
вот некоторые примеры строк, с которыми я работаю и результат мне нужен:
home/cat1/subcat2 => home
test/cat2 => test
startpage => startpage
Я хочу получить строку до первого /, а если нет / присутствует, получить всю строку.
я попробовал,
substr($mystring, 0, strpos($mystring, '/'))
Я думаю, что он говорит - получить должность / а затем получить подстроку из позиции 0 в это позиция.
Я не знаю, как обращаться с делом, где нет /, не делая заявление слишком большим.
есть ли способ справиться с этим случаем, не делая оператор PHP слишком сложным?
14 ответов:
использовать
explode()$arr = explode("/", $string, 2); $first = $arr[0];в этом случае, я использую до
explodeТак что PHP не будет сканировать строку больше, чем нужно.
The наиболее эффективным!--6--> решение
strtok:strtok($mystring, '/')например:
$mystring = 'home/cat1/subcat2/'; $first = strtok($mystring, '/'); echo $first; // homeи
$mystring = 'home'; $first = strtok($mystring, '/'); echo $first; // home
Как насчет этого :
substr($mystring.'/', 0, strpos($mystring, '/'))просто добавьте '/' в конец строки, чтобы вы могли быть уверены, что есть хотя бы один ;)
Это, пожалуй, самый короткий пример, который пришел мне на ум:
list($first) = explode("/", $mystring);1)
list()автоматически назначит строку до"/"Если разделитель не найден
2) Если разделитель"/"не найдено, то вся строка будет назначена...и если вы действительно одержимы производительностью, вы можете добавить дополнительный параметр для explode
explode("/", $mystring, 2)который ограничивает максимум возвращаемых элементов.
однострочная версия принятого ответа:
$out=explode("/", $mystring, 2)[0];должен работать в php 5.4+
эту работу должна выполнять функция 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 ); } }Я еще не проверял, но это должно работать просто отлично.. И это довольно быстро, как хорошо
поздно лучше, чем никогда. php имеет предопределенную функцию для этого. вот это хороший способ.
strstrЕсли вы хотите получить часть перед матчем просто набор before_needle (3-й параметр) в
truehttp://php.net/manual/en/function.strstr.phpfunction not_strtok($string, $delimiter) { $buffer = strstr($string, $delimiter, true); if (false === $buffer) { return $string; } return $buffer; } var_dump( not_strtok('st/art/page', '/') );
Вы можете создать вспомогательную функцию, чтобы позаботиться об этом:
/** * 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
вы можете попробовать использовать регулярное выражение следующим образом:
$s = preg_replace('|/.*$|', '', $s);иногда регулярное выражение медленнее, поэтому, если производительность является проблемой, убедитесь, что это правильно и используйте другую альтернативу с подстроками, если она более подходит для вас.
$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); }
Comments