Ответ 1
Используйте explode()
$arr = explode("/", $string, 2);
$first = $arr[0];
В этом случае я использую параметр limit
для explode
, так что 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
on 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);
}