Я пытаюсь извлечь подстроку. Мне нужна помощь с этим в PHP.
Вот несколько примеров строк, с которыми я работаю, и результаты, которые мне нужны:
home/cat1/subcat2 => home
test/cat2 => test
startpage => startpage
Я хочу получить строку до первого /
, но если нет /
, получить всю строку.
Я попытался,
substr($mystring, 0, strpos($mystring, '/'))
Я думаю, что это говорит - получить позицию /
и затем получить подстроку из позиции 0 в эту позицию.
Я не знаю, как справиться со случаем, когда нет /
, не делая заявление слишком большим.
Есть ли способ справиться с этим делом, не делая оператор PHP слишком сложным?
s($str)->beforeFirst('/')
полезным, как найти в этой автономной библиотеке .Ответы:
использование
explode()
В этом случае я использую
limit
параметр to,explode
чтобы php не сканировал строку больше, чем нужно.источник
$arr = explode('/',$mystring,2); echo $arr[0];
. Я не могу получить первую строку в одном операторе -echo explode('/',$mystring,2)[0];
. Так как Explode возвращает массив, я должен быть в состоянии сделать это правильно? Но я получаю ошибку. Какие-либо предложения?explode() + [0]
это многословный способ написатьstrtok($string, "/")
Наиболее эффективным решением является
strtok
функция:Например:
и
источник
current-explode
решение. (Не то, чтобы я использовал его так часто, чтобы этоexplode
решений.strtok
ISfirst/second
вернется ,first
но/second
вернется ,second
а не пустая строка.источник
Как насчет этого :
Просто добавьте «/» в конец mystring, чтобы быть уверенным, что есть хотя бы один;)
источник
Однострочная версия принятого ответа:
Должен работать в php 5.4+
источник
Это, наверное, самый короткий пример, который мне пришёл в голову:
1)
list()
будет автоматически назначать строку до тех пор, пока"/"
разделитель не будет найден2) если разделитель
"/"
не найден, тогда будет назначена вся строка... и если вы действительно одержимы производительностью, вы можете добавить дополнительный параметр для разнесения,
explode("/", $mystring, 2)
который ограничивает максимум возвращаемых элементов.источник
strtok()
небезопасно.strtok()
?strtok()
небезопасным?Лучше поздно, чем никогда. PHP имеет предопределенную функцию для этого. вот этот хороший способ.
если вы хотите получить деталь перед совпадением, просто установите before_needle (третий параметр) на
true
http://php.net/manual/en/function.strstr.phpисточник
strstr
это немного быстрее, чемstrtok
. Я пойду с первым.Функция strstr () в PHP 5.3 должна делать эту работу. Однако третий параметр должен быть установлен в true.
Но если вы не используете 5.3, то приведенная ниже функция должна работать точно:
Я не проверял это, хотя, но это должно работать просто отлично .. И это также довольно быстро
источник
strstr()
, но имейте вfalse
виду, что он возвращает, если строка не содержит$needle
, поэтому приведенныеexplode()
выше решения лучше подходят в этом случае.Вы можете создать вспомогательную функцию, чтобы позаботиться об этом:
Вот пример использования:
источник
Вы можете попробовать использовать регулярные выражения, как это:
иногда, регулярные выражения медленнее, поэтому, если производительность является проблемой, убедитесь, что вы правильно отметили ее и использовали другую альтернативу с подстроками, если она вам больше подходит.
источник
explode
было бы интересно посмотреть, что быстрее.Использование
current
onexplode
облегчит процесс.источник
источник
Вы также можете использовать это однострочное решение
источник
Я думаю, что это должно работать?
источник
почему бы не использовать:
ИЛИ:
источник