Potrzebuję funkcji, która zwraca podciąg między dwoma słowami (lub dwoma znakami). Zastanawiam się, czy istnieje funkcja php, która to osiąga. Nie chcę myśleć o wyrażeniach regularnych (cóż, mógłbym to zrobić, ale naprawdę nie sądzę, że to najlepszy sposób). Myślenie strpos
i substr
funkcje. Oto przykład:
$string = "foo I wanna a cake foo";
Nazywamy tę funkcję: $substring = getInnerSubstring($string,"foo");
Zwraca: „Chcę ciasto”.
Z góry dziękuję.
Aktualizacja:
Cóż, do tej pory mogę po prostu uzyskać podciąg między dwoma słowami w jednym ciągu, czy pozwolisz mi pójść dalej i zapytać, czy mogę rozszerzyć użycie, getInnerSubstring($str,$delim)
aby uzyskać ciągi, które znajdują się między wartością delim, przykład:
$string =" foo I like php foo, but foo I also like asp foo, foo I feel hero foo";
Otrzymuję tablicę jak {"I like php", "I also like asp", "I feel hero"}
.
\Illuminate\Support\Str::between('This is my name', 'This', 'name');
jest to wygodne. laravel.com/docs/7.x/helpers#method-str-betweenOdpowiedzi:
Jeśli ciągi znaków są różne (np .: [foo] i [/ foo]), spójrz na ten post od Justina Cooka. Kopiuję jego kod poniżej:
źródło
Wyrażenia regularne to droga:
onlinePhp
źródło
Przykładowe zastosowanie:
źródło
Przykład użycia:
Jeśli chcesz usunąć otaczające spacje, użyj
trim
. Przykład:źródło
źródło
użyj funkcji php strstr dwukrotnie.
wyjścia:
"is a great day to"
źródło
Lubię rozwiązania wyrażeń regularnych, ale żadne z pozostałych mi nie odpowiada.
Jeśli wiesz, że wynik będzie tylko 1, możesz użyć następującego:
Zmień PRZED i PO na żądane ograniczniki.
Pamiętaj również, że ta funkcja zwróci cały ciąg, jeśli nic nie zostanie dopasowane.
To rozwiązanie jest wielowierszowe, ale możesz bawić się modyfikatorami w zależności od potrzeb.
źródło
Nie jest profesjonalistą od PHP. ale ostatnio też wpadłem na tę ścianę i to właśnie wymyśliłem.
źródło
Jeśli używasz
foo
jako separatora, spójrz naexplode()
źródło
Przykład:
To zwróci „faceta w środku”.
źródło
Jeśli masz wiele powtórzeń z jednego ciągu i masz inny wzorzec [początek] i [\ koniec]. Oto funkcja, która wyświetla tablicę.
źródło
Oto funkcja
Użyj tego jak
Wyjście (zwróć uwagę, że zwraca spacje na początku i na końcu łańcucha, jeśli istnieje)
Jeśli chcesz przyciąć wynik, użyj funkcji takiej jak
Wynik : Ta funkcja zwróci false, jeśli
$boundstring
nie zostanie znaleziona w$string
lub jeśli$boundstring
istnieje tylko raz w$string
, w przeciwnym razie zwraca podciąg między pierwszym a ostatnim wystąpieniem$boundstring
in$string
.Bibliografia
źródło
IF
klauzuli mówisz? może popełniłem jakąś literówkę, ale szczerze mówiąc, nie widzę teraz nic dziwnego. ObaIF
znaki, których użyłem w powyższej funkcji, mają odpowiednie warunki otaczające nawiasy. PierwszyIF
ma również nawiasy klamrowe (nawiasy klamrowe), które otaczają blok 2 wierszy, drugiIF
nie potrzebuje ich, ponieważ jest to kod jednowierszowy. Czego mi brakuje?Poprawa odpowiedzi Alejandro . Możesz pozostawić argumenty
$start
lub$end
puste i użyje początku lub końca ciągu.źródło
Posługiwać się:
źródło
Nieco poprawiony kod z GarciaWebDev i Henry Wang. Jeśli podano puste $ start lub $ end, funkcja zwraca wartości od początku lub końca ciągu $. Dostępna jest również opcja Inclusive, niezależnie od tego, czy chcemy uwzględnić wynik wyszukiwania, czy nie:
źródło
Muszę coś dodać do postu Juliusa Tilvikasa. Szukałem rozwiązania takiego jak to, które opisał w swoim poście. Ale myślę, że jest błąd. Naprawdę nie widzę ciągu między dwoma ciągami, ale dzięki temu rozwiązaniu otrzymuję więcej, ponieważ muszę odjąć długość ciągu początkowego. Kiedy to robię, naprawdę otrzymuję ciąg między dwoma ciągami.
Oto moje zmiany jego rozwiązania:
Greetz
V
źródło
Spróbuj tego, to działa dla mnie, uzyskaj dane między słowami testowymi .
źródło
W
strpos
stylu PHP to zwróci,false
jeśli znak początkowysm
lub końcowyem
nie zostanie znaleziony .Ten wynik (
false
) różni się od pustego ciągu, który otrzymujesz, jeśli nie ma nic między znacznikiem początkowym i końcowym.Funkcja zwróci tylko pierwsze dopasowanie.
To oczywiste, ale warto wspomnieć, że funkcja będzie najpierw szukać,
sm
a potem szukaćem
.Oznacza to, że możesz nie uzyskać pożądanego wyniku / zachowania, jeśli
em
musisz najpierw przeszukać, a następnie łańcuch musi zostać przeanalizowany wstecz w poszukiwaniusm
.źródło
To jest funkcja, której do tego używam. Połączyłem dwie odpowiedzi w jednej funkcji dla jednego lub wielu separatorów.
Do prostego użycia (zwraca dwa):
Aby uzyskać każdy wiersz w tabeli do tablicy wyników:
źródło
używam
Podtytuł <TAG> dla dowolnego separatora.
źródło
zredagowana wersja tego, co napisał Alejandro García Iglesias.
Umożliwia to wybranie określonej lokalizacji ciągu, który chcesz uzyskać, na podstawie liczby znalezionych wyników.
stosowanie:
strpos ma dodatkowe opcjonalne dane wejściowe, które umożliwiają rozpoczęcie wyszukiwania w określonym miejscu. więc przechowuję poprzednią pozycję w $ cPos, więc gdy pętla for ponownie sprawdza, zaczyna się na końcu miejsca, w którym została przerwana.
źródło
Zdecydowana większość odpowiedzi tutaj nie odpowiada edytowanej części, myślę, że zostały dodane wcześniej. Można to zrobić za pomocą wyrażenia regularnego, jak wspomina jedna z odpowiedzi. Miałem inne podejście.
Ta funkcja wyszukuje ciąg $ string i znajduje pierwszy ciąg między $ start i $ end, zaczynając od pozycji $ offset. Następnie aktualizuje pozycję przesunięcia $, aby wskazywała początek wyniku. Jeśli $ includeDelimiters ma wartość true, uwzględnia separatory w wyniku.
Jeśli ciąg $ start lub $ end nie zostanie znaleziony, zwraca wartość null. Zwraca również null, jeśli $ string, $ start lub $ end są pustym łańcuchem.
Następująca funkcja znajduje wszystkie ciągi, które znajdują się między dwoma ciągami (bez nakładania się). Wymaga poprzedniej funkcji, a argumenty są takie same. Po wykonaniu, $ offset wskazuje początek ostatnio znalezionego ciągu wynikowego.
Przykłady:
str_between_all('foo 1 bar 2 foo 3 bar', 'foo', 'bar')
daje[' 1 ', ' 3 ']
.str_between_all('foo 1 bar 2', 'foo', 'bar')
daje[' 1 ']
.str_between_all('foo 1 foo 2 foo 3 foo', 'foo', 'foo')
daje[' 1 ', ' 3 ']
.str_between_all('foo 1 bar', 'foo', 'foo')
daje[]
.źródło
Posługiwać się:
źródło
Miałem problemy z zastosowaną tutaj funkcją get_string_between (). Więc przyszedłem z własną wersją. Może mogłoby pomóc ludziom w tej samej sprawie co moja.
źródło
napisał je jakiś czas temu i uznał je za bardzo przydatne w szerokim zakresie zastosowań.
źródło
Z pewnym wyłapywaniem błędów. W szczególności większość przedstawionych funkcji wymaga $ end, podczas gdy w rzeczywistości w moim przypadku potrzebowałem go jako opcjonalnego. Użyj tego, że $ end jest opcjonalne i oblicz wartość FALSE, jeśli $ start w ogóle nie istnieje:
źródło
Wersja UTF-8 odpowiedzi @Alejandro Iglesias będzie działać dla znaków spoza alfabetu łacińskiego:
źródło
Mam na to najlepsze rozwiązanie od tonyspiro
źródło
Można to łatwo zrobić za pomocą tej małej funkcji:
źródło
Używam tego od lat i działa dobrze. Prawdopodobnie mógłby być bardziej wydajny, ale
grabstring ("Ciąg testowy", "", "", 0) zwraca Ciąg testowy
grabstring ("Ciąg testowy", "Test", "", 0) zwraca ciąg
przechwytywania ciągu ("Ciąg testowy", "s", "", 5) zwraca ciąg
}
źródło