Estou com um problema, tenho uma matriz de cadeias e quero explodir em diferentes delimitadores. Por exemplo
$example = 'Appel @ Ratte';
$example2 = 'apple vs ratte'
e eu preciso de uma matriz que explode em @ ou vs.
Eu já escrevi uma solução, mas se todos tiverem uma solução melhor, poste aqui.
private function multiExplode($delimiters,$string) {
$ary = explode($delimiters[0],$string);
array_shift($delimiters);
if($delimiters != NULL) {
if(count($ary) <2)
$ary = $this->multiExplode($delimiters, $string);
}
return $ary;
}
Respostas:
que tal usar
fonte
explode()
em argumentos individuais/
,?
). Por exemplo:preg_split("/(\/|\?|=)/", $foo);
.$str='/x/1/2/3/4/5/y/100/200/z/777'; preg_split("/(x|y|z|)/", $str);
e para verarray('x'=>'1/2/3/4/5', 'y'=>'100/200', 'z'=>'777')
/ (
e) /
impedido o preg_split de funcionar. Eu tinha que remover os espaços e, em seguida, ele funcionou como esperado (utilizando PHP 7)Você pode pegar a primeira corda, substituir todas
@
porvs
usarstr_replace
e depois explodirvs
ou vice-versa.fonte
(@|@!)
caso)Fonte: php @ metehanarslan em php.net
fonte
Que tal usar
strtr()
para substituir todos os seus outros delimitadores pelo primeiro?É meio ilegível, eu acho, mas eu testei como trabalhando aqui.
One-liners ftw!
fonte
Não
strtok()
funcionaria para você?fonte
Simplesmente você pode usar o seguinte código:
fonte
Você pode tentar esta solução .... Funciona muito bem
Fonte: http://www.phpdevtips.com/2011/07/exploding-a-string-using-multiple-delimiters-using-php/
fonte
Eu faço assim ...
fonte
Que tal agora?
No seu caso, você deve usar uma matriz para o parâmetro $ delimiters. Então é possível usar vários caracteres como um delimitador.
Se você não se importa com espaços à direita nos resultados, pode remover a
array_map('trim', [...] )
peça na linha de retorno. (Mas não se preocupe, neste caso. Mantenha o que estápreg_split
nele.)Versão necessária do PHP: 5.3.0 ou superior.
Você pode testá-lo aqui
fonte
Você terá alguns problemas (e se você tiver esta sequência: "vs @ maçãs" por exemplo) usando esse método de separação, mas se começarmos afirmando que você pensou sobre isso e corrigiu todas essas possíveis colisões, você poderia simplesmente substituir todas as ocorrências de
$delimiter[1]
to$delimiter[n]
com$delimiter[0]
e depois dividir a primeira?fonte
Se o seu delimitador tiver apenas caracteres, você poderá usá-lo
strtok
, o que parece ser mais adequado aqui. Observe que você deve usá-lo com umwhile
loop para obter os efeitos.fonte
Isso funcionará:
Como você pode ver, primeiro cola as partes explodidas junto com um espaço, para depois separá-las novamente, desta vez ocupando os espaços com ele.
fonte