Eu preciso de uma função que retorna a substring entre duas palavras (ou dois caracteres). Eu estou querendo saber se existe uma função php que consegue isso. Eu não quero pensar em regex (bem, eu poderia fazer um, mas realmente não acho que seja o melhor caminho a percorrer). Pensando strpos
e substr
funções. Aqui está um exemplo:
$string = "foo I wanna a cake foo";
Chamamos a função: $substring = getInnerSubstring($string,"foo");
Ele retorna: "Eu quero um bolo".
Desde já, obrigado.
Atualização:
Bem, até agora, posso obter uma substring entre duas palavras em uma única string. Você me permite ir um pouco mais longe e perguntar se posso estender o uso de getInnerSubstring($str,$delim)
para obter qualquer string que esteja entre o valor delim, exemplo:
$string =" foo I like php foo, but foo I also like asp foo, foo I feel hero foo";
Eu recebo uma matriz como {"I like php", "I also like asp", "I feel hero"}
.
\Illuminate\Support\Str::between('This is my name', 'This', 'name');
é conveniente. Laravel.com/docs/7.x/helpers#method-str-betweenRespostas:
Se as strings são diferentes (por exemplo: [foo] e [/ foo]), dê uma olhada nesta postagem de Justin Cook. Copio seu código abaixo:
fonte
Expressões regulares é o caminho a seguir:
onlinePhp
fonte
Uso da amostra:
fonte
Exemplo de uso:
Se você deseja remover o espaço em branco circundante, use
trim
. Exemplo:fonte
fonte
use a função strstr php duas vezes.
saídas:
"is a great day to"
fonte
Gosto das soluções de expressão regular, mas nenhuma das outras combina comigo.
Se você sabe que haverá apenas 1 resultado, você pode usar o seguinte:
Altere ANTES e DEPOIS para os delimitadores desejados.
Lembre-se também de que esta função retornará toda a cadeia caso nada corresponda.
Esta solução é multilinha, mas você pode jogar com os modificadores, dependendo de suas necessidades.
fonte
Não é um profissional de php. mas recentemente corri contra esse muro também e foi isso que eu criei.
fonte
Se você estiver usando
foo
como delimitador, vejaexplode()
fonte
Exemplo:
Isso retornará "o cara do meio".
fonte
Se você tiver várias recorrências de uma única sequência e tiver um padrão [start] e [\ end] diferente. Aqui está uma função que gera uma matriz.
fonte
Aqui está uma função
Use-o como
Saída (observe que ele retorna espaços à frente e na e da sua sequência, se existir)
Se você deseja cortar o resultado, use uma função como
Resultado : esta função retornará false se
$boundstring
não foi encontrado$string
ou se$boundstring
existe apenas uma vez$string
, caso contrário, retorna a substring entre a primeira e a última ocorrência de$boundstring
in$string
.Referências
fonte
IF
cláusula você está falando? talvez tenha cometido um erro de digitação, mas, para ser sincero, não vejo nada de estranho no momento. Ambos osIF
s que usei na função acima têm colchetes adequados ao redor da condição. PrimeiroIF
também temos colchetes (chaves) que cercam o bloco de 2 linhas; o segundoIF
não precisa deles porque é um código de linha única. O que estou perdendo?Melhoria da resposta de Alejandro . Você pode deixar os argumentos
$start
ou$end
vazios e ele usará o início ou o fim da string.fonte
Usar:
fonte
Um pouco melhor código de GarciaWebDev e Henry Wang. Se $ start ou $ end vazios forem fornecidos, a função retornará valores do início ou do final da string $. A opção Inclusive também está disponível, se queremos incluir o resultado da pesquisa ou não:
fonte
Tenho que acrescentar algo ao post de Julius Tilvikas. Procurei uma solução como essa que ele descreveu em seu post. Mas acho que há um erro. Eu não entendo muito a string entre duas, também recebo mais com esta solução, porque tenho que subtrair o comprimento da string inicial. Quando faço isso, eu realmente recebo a String entre duas strings.
Aqui estão as minhas alterações de sua solução:
Greetz
V
fonte
Tente isso, seu trabalho para mim, obtenha dados entre as palavras de teste .
fonte
No
strpos
estilo do PHP, isso retornaráfalse
se a marca inicialsm
ou finalem
não forem encontradas.Esse resultado (
false
) é diferente de uma string vazia que é o que você obtém se não houver nada entre as marcas de início e de fim.A função retornará apenas a primeira correspondência.
É óbvio, mas vale a pena mencionar que a função procurará primeiro
sm
e depois paraem
.Isso implica que você pode não obter o resultado / comportamento desejado se
em
for necessário pesquisar primeiro e, em seguida, a string deverá ser analisada para trás em busca desm
.fonte
Esta é a função que estou usando para isso. Combinei duas respostas em uma função para delimitadores únicos ou múltiplos.
Para uso simples (retorna dois):
Para obter cada linha de uma tabela na matriz de resultados:
fonte
eu uso
Legenda <TAG> para o delimitador que você desejar.
fonte
uma versão editada do que Alejandro García Iglesias colocou.
Isso permite que você escolha um local específico da string que deseja obter com base no número de vezes que o resultado foi encontrado.
uso:
O strpos possui uma entrada opcional adicional para iniciar sua pesquisa em um ponto específico. então, guardo a posição anterior em $ cPos. Assim, quando o loop for verifica novamente, ele começa no final de onde parou.
fonte
A grande maioria das respostas aqui não responde à parte editada, acho que foram adicionadas antes. Isso pode ser feito com regex, como uma resposta menciona. Eu tive uma abordagem diferente.
Essa função pesquisa $ string e localiza a primeira entre $ strings e $ end, começando na posição de deslocamento $. Em seguida, atualiza a posição de deslocamento $ para apontar para o início do resultado. Se $ includeDelimiters for verdadeiro, ele incluirá os delimitadores no resultado.
Se a cadeia $ start ou $ end não for encontrada, ela retornará nulo. Ele também retornará null se $ string, $ start ou $ end forem uma string vazia.
A função a seguir localiza todas as cadeias que estão entre duas cadeias (sem sobreposições). Requer a função anterior e os argumentos são os mesmos. Após a execução, $ offset aponta para o início da última sequência de resultados encontrada.
Exemplos:
str_between_all('foo 1 bar 2 foo 3 bar', 'foo', 'bar')
dá[' 1 ', ' 3 ']
.str_between_all('foo 1 bar 2', 'foo', 'bar')
dá[' 1 ']
.str_between_all('foo 1 foo 2 foo 3 foo', 'foo', 'foo')
dá[' 1 ', ' 3 ']
.str_between_all('foo 1 bar', 'foo', 'foo')
dá[]
.fonte
Usar:
fonte
Eu tive alguns problemas com a função get_string_between (), usada aqui. Então eu vim com minha própria versão. Talvez isso possa ajudar as pessoas no mesmo caso que o meu.
fonte
escreveu isso há algum tempo, achou muito útil para uma ampla gama de aplicativos.
fonte
Com algum erro de captura. Especificamente, a maioria das funções apresentadas exige que $ end exista, quando na verdade, no meu caso, eu precisava que fosse opcional. Use this is $ end é opcional e avalie FALSE se $ start não existir:
fonte
A versão UTF-8 da resposta @Alejandro Iglesias, funcionará para caracteres não latinos:
fonte
Tem a melhor solução para isso da tonyspiro
fonte
Isso pode ser feito facilmente usando esta pequena função:
fonte
Eu tenho usado isso há anos e funciona bem. Provavelmente poderia se tornar mais eficiente, mas
grabstring ("Test string", "", "", 0) retorna String de teste
grabstring ("Test string", "Test", "", 0) retorna string
grabstring ("Test string", "s", "", 5) retorna string
}
fonte