str_replace
52 3.3 STRINGS TAMBÉM SÃO ARRAYS?
Comprei um livro da cor laranja
Podemos também especificar um array para ambos: o texto a ser substituído e o texto a ser procurado. Se os arrays são correspondentes, a troca é feita na ordem dos elementos.
$texto = 'Comprei um livro da cor azul e amarelo';
print str_replace(['azul', 'amarelo'], ['laranja', 'preto'], $texto );
Em nosso exemplo, temos a cor azul na posição zero, que será substituída pela cor laranja, que está na posição zero também. O mesmo ocorre com os itens na posição 1 do array.
Comprei um livro da cor laranja e preto
Porém, não é apenas isso que conseguimos com a função
str_replace . Além disso, temos alguns comportamentos bem
dinâmicos:
$texto = 'Comprei um livro da cor azul e amarelo'; print str_replace(['azul', 'amarelo'], 'lilás', $texto);
Podemos utilizar um array com o texto a ser substituído por um mesmo texto informado como string no segundo parâmetro. Em nosso exemplo, substituímos os textos azul e amarelo por
lilás .
Comprei um livro da cor lilás e lilás
E finalmente, a função str_replace nos fornece o número
total de substituições feitas no texto: $texto = 'Comprei um livro da cor azul e amarelo'; $substituicoes = 0; str_replace(['azul', 'amarelo'], 'lilás', $texto, $substituicoes); print $substituicoes; Nesse exemplo, estamos utilizando o mesmo texto do exemplo 3.3 STRINGS TAMBÉM SÃO ARRAYS? 53
anterior, no qual efetuamos duas substituições. Porém, agora estamos interessados no número de substituições realizadas que estamos armazenando na variável $substituicoes : 2 Um detalhe importante é que o parâmetro usado para contar o total de substituições realizadas é passado por referência, e não por valor, o que não torna possível passar um valor estático. ... str_replace(['azul', 'amarelo'], 'lilás', $texto, 0); ... Caso você tente passar um valor estático, como o valor zero do exemplo anterior, um FATAL ERROR é exibido:
PHP Fatal error: Only variables can be passed by reference in /zc e/str_replace.php on line 5 Fatal error: Only variables can be passed by reference in /zce/str _replace.php on line 5 O erro anterior nos diz que não é possível passar valor estático por referência, apenas variáveis.
Para realizar uma comparação binária com strings em PHP, possuímos algumas funções que nos auxiliam, como a
strcasecmp , que realiza uma comparação independentemente de letras maiúsculas ou minúsculas. $string1 = 'olá!'; $string2 = 'OLá!'; if ( 0 === strcasecmp($string1, $string2)) { print 'Iguais !'; }
strcasecmp
54 3.3 STRINGS TAMBÉM SÃO ARRAYS?Utilizando strcasecmp , devemos nos atentar ao seu retorno
para saber se realmente as strings são iguais ou divergentes. No exemplo anterior, será retornado 0 (zero), pois as strings são idênticas e será exibida a mensagem Iguais .
Mas essa função possui outros retornos exemplificados pela tabela a seguir: Valor Retorno Menor que zero (-1, -2 , -3 etc) A função retornará menor que zero se a string passada como primeiro parâmetro for menor do que a string passada no segundo. Maior que
quero (1, 2, 3) A função retornará maior que zero se a string passada como primeiroparâmetro for maior que a string passada como segundo. Zero (0) Se as duas strings forem iguais.
Caso você precise desse mesmo comportamento, mas precise ser levado em consideração letras maiúsculas e minúsculas, utilize a função strcmp .
Podemos testar os retornos com os seguintes exemplos:
$str1 = "livroABC"; $str2 = "livroABC";
var_dump(strcmp($str1, $str2));
Como você pode perceber, a (string) livroABC é retornada
um int(0) ao utilizarmos strcmp em nosso var_dump . Isso
ocorreu pois não existem diferenças entre as strings. Agora vamos criar um teste onde todas as letras de nossa string fiquem minúsculas, por exemplo: $str1 = "livroabc"; $str2 = "livroABC"; var_dump(strcmp($str1, $str2)); 3.3 STRINGS TAMBÉM SÃO ARRAYS? 55
correspondente a outra. Imagine que precisamos achar algum endereço, mas não sabemos se o local é uma rua ou avenida. Podemos utilizar similar_text para determinar esse tipo de
similaridade.
$string1 = 'Av. Livro de Certificação PHP'; $string2 = 'Rua, Certificação PHP';
print similar_text($string1, $string2);
No exemplo anterior, similar_text vai nos retornar o
número de caracteres que existem em ambas as strings, que nesse caso é 19, pois a parte correspondente em ambas as strings é o texto
Certificação PHP . Repare que existe um espaço em branco antes
da palavra Certificação , por isso o resultado em questão é 19, e
não 18.
Muitas vezes, saber somente quais caracteres são iguais em ambas strings não nos fornece muita flexibilidade. Com
similar_text , podemos passar um terceiro parâmetro para saber qual é a porcentagem de similaridade entre as strings. $porcentagem = 0; $string1 = 'Av. Livro de Certificação PHP'; $string2 = 'Rua, Certificação PHP'; print similar_text($string1, $string2, $porcentagem);
Adicionando o terceiro parâmetro, possuímos o valor em porcentagem (que nesse caso é 70.37037037037) da similaridade do texto. Esse valor é passado por referência, e o valor de retorno da função não é modificado.
Continuando nesse mundo de similaridades entre strings, possuímos a função levenshtein , que nos retorna qual o número
de caracteres que devemos substituir para possuir duas strings idênticas.
$string1 = 'Av. Livro de Certificação PHP';
$string2 = 'Rua, Certificação PHP'; print levenshtein($string1, $string2);
A ordem das strings passadas para a função é muito importante, pois a função levenshtein calculará quantos caracteres
precisamos mudar na $string1 para transformá-la na $string2 .
E se alterarmos a ordem dos parâmetros, teremos resultados diferentes.
A função levenshtein possui alguns parâmetros a mais para
serem usados. Para maiores informações sobre essa função, veja a documentação oficial do PHP, em http://php.net/manual/en/function.levenshtein.php.
Frequentemente, desejamos contar o total de caracteres que uma determinada string possui. Para isso, PHP conta com a função
strlen . Com ela, é possível contar a quantidade existente de
caracteres em uma string, porém devemos tomar cuidado com o seu comportamento.
Antes de passar para a resposta, tente interpretar o código a seguir:
print strlen('1\n2');
Se você ficou em dúvida sobre o caractere de quebra de linha
\n , não se preocupe, você não foi o único. A resposta certa é 4.
Esse é o resultado obtido exatamente pelo uso de aspas simples. Com isso, o PHP sempre interpretará a string como um texto plano. Agora que entendemos como funciona com aspas simples,