Próbuję wyodrębnić podciąg. Potrzebuję pomocy przy zrobieniu tego w PHP.
Oto kilka przykładowych ciągów, z którymi pracuję, i potrzebnych mi wyników:
home/cat1/subcat2 => home
test/cat2 => test
startpage => startpage
Chcę uzyskać ciąg do pierwszego /
, ale jeśli nie /
ma, zdobądź cały ciąg.
Próbowałem,
substr($mystring, 0, strpos($mystring, '/'))
Myślę, że mówi - uzyskaj pozycję, /
a następnie pobierz podciąg z pozycji 0 do tej pozycji.
Nie wiem, jak sobie poradzić z przypadkiem, w którym nie ma /
, bez zbytniego stwierdzenia.
Czy istnieje sposób na obsłużenie tego przypadku bez zbytniego komplikowania instrukcji PHP?
s($str)->beforeFirst('/')
pomocny, co znajdziesz w tej samodzielnej bibliotece .Odpowiedzi:
Posługiwać się
explode()
W tym przypadku używam
limit
parametru, abyexplode
php nie skanował ciągu więcej niż jest to potrzebne.źródło
$arr = explode('/',$mystring,2); echo $arr[0];
. Nie mogę uzyskać pierwszego ciągu w jednym oświadczeniu -echo explode('/',$mystring,2)[0];
. Ponieważ eksplodowanie zwraca tablicę, powinienem być w stanie to zrobić, prawda? Ale pojawia się błąd. Jakieś sugestie?explode() + [0]
to rozwlekły sposób pisaniastrtok($string, "/")
Najskuteczniejszym rozwiązaniem jest
strtok
funkcja:Na przykład:
i
źródło
current-explode
rozwiązanie. (Nie to, że używam go tak często, że ma to znaczenie.)explode
rozwiązań.strtok
tofirst/second
zwróci,first
ale/second
zwrócisecond
zamiast pustego ciągu.źródło
A co z tym :
Po prostu dodaj „/” na końcu mystringu, aby mieć pewność, że jest co najmniej jeden;)
źródło
Jednowierszowa wersja zaakceptowanej odpowiedzi:
Powinien działać w php 5.4+
źródło
To chyba najkrótszy przykład, jaki przyszedł mi do głowy:
1)
list()
automatycznie przypisuje ciąg do momentu"/"
znalezienia separatora2) jeśli separator
"/"
nie zostanie znaleziony, zostanie przypisany cały ciąg... a jeśli masz obsesję na punkcie wydajności, możesz dodać dodatkowy parametr, aby eksplodować,
explode("/", $mystring, 2)
który ogranicza maksymalną liczbę zwracanych elementów.źródło
strtok()
jest niebezpieczny.strtok()
?strtok()
niebezpiecznym?Lepiej późno niż wcale. php ma do tego predefiniowaną funkcję. oto dobry sposób.
jeśli chcesz otrzymać część przed dopasowaniem, po prostu ustaw before_needle (trzeci parametr) na
true
http://php.net/manual/en/function.str.phpźródło
strstr
jest nieco szybszy niżstrtok
. Pójdę z tym pierwszym.Funkcja strstr () w PHP 5.3 powinna wykonać to zadanie. Jednak trzeci parametr powinien być ustawiony na wartość true ..
Ale jeśli nie używasz 5.3, poniższa funkcja powinna działać dokładnie:
Nie testowałem tego, ale to powinno działać dobrze ... I jest też całkiem szybkie
źródło
strstr()
, ale pamiętaj, że zwraca,false
jeśli ciąg nie zawiera$needle
, dlategoexplode()
powyższe rozwiązania są lepiej dopasowane w tym przypadku.Możesz stworzyć funkcję pomocniczą, aby się tym zająć:
Oto przykład użycia:
źródło
Możesz spróbować użyć wyrażenia regularnego w ten sposób:
czasami wyrażenia regularne są jednak wolniejsze, więc jeśli problemem jest wydajność, upewnij się, że wykonałeś to poprawnie i użyj innej alternatywy z podciągami, jeśli jest bardziej odpowiednia dla Ciebie.
źródło
explode
, ciekawie byłoby zobaczyć, który jest szybszy.Używanie
current
naexplode
ułatwiłoby ten proces.źródło
źródło
Możesz także skorzystać z tego rozwiązania jednokreskowego
źródło
Myślę, że to powinno działać?
źródło
dlaczego nie użyć:
LUB:
źródło