PHP извлечение подстроки. Получить строку перед первой '/' или всей строкой - PullRequest
142 голосов
/ 20 декабря 2009

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

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

home/cat1/subcat2 => home

test/cat2 => test

startpage => startpage

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

Я пытался,

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

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

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

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

Ответы [ 14 ]

238 голосов
/ 18 июня 2014

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

strtok($mystring, '/')

Например:

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

и

$mystring = 'home';
$first = strtok($mystring, '/');
echo $first; // home
225 голосов
/ 20 декабря 2009

Использование explode()

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

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

94 голосов
/ 30 декабря 2011
$first = explode("/", $string)[0];
11 голосов
/ 30 марта 2011

Что по этому поводу:

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

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

8 голосов
/ 28 февраля 2017

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

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

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

8 голосов
/ 23 апреля 2015

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

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

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

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

5 голосов
/ 08 марта 2011

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

Я не проверял это, хотя, но это должно работать просто отлично .. И это также довольно быстро

4 голосов
/ 29 марта 2016

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

strstr

если вы хотите получить деталь перед совпадением, просто установите before_needle (3-й параметр) на 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', '/')
);
2 голосов
/ 24 августа 2016

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

/**
 * 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
2 голосов
/ 31 декабря 2012

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

 $str = current(explode("/", $str, 2));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...