treinamento php: strings & patterns
TRANSCRIPT
Fundamentos• Encapsulados em aspas simples:
– Representam strings simples– De uso literal
• Encapsulado em aspas duplas:– Trata como strings complexas– Permite escape e substituição de variáveis
Ex.:$who = "World";echo "Hello $who\n"; //Exibe "Hello World" seguido de nova linhaecho 'Hello $who\n'; //Exibe "Hello $who\n"
Notações de caracteres
• echo "\x23";– Quando iniciada com x indica uma expressão
em hexadecimal
• echo "\043";– Ao iniciar com 0 (zero) representa um número
octal
Tabela extraída de:http://www.tableascii.com
Interpolação
$me = 'Davey';
$names = array ('Smith', 'Jones', 'Jackson');
echo "There cannot be more than two {$me}s!";
echo "Citation: {$names[1]}[1987]";
Sem o uso das chaves (braces) o parser não reconheceria o $mes (só existe o $me).
O $names[1][1987] seria substituído pelo conteúdo do array no índice [1][1987], dependendo do parser*
Sintaxe Heredoc• Processa strings complexas
• Utiliza um conjunto de tokens para delimitar a string
• Inicia com o operador especial <<< seguido pelo token e ⏎
• Termina com o próprio token com ; (opcional) e ⏎
• Útil para tratar grandes porções de strings contendo aspas duplas (sem a necessidade de escapar)
Sintaxe Heredoc
• Ex.: $who = "World";echo <<<TEXTSo I said, "Hello $who"TEXT;
Lembre-se que o ⏎ (enter) após o token não é exibido. Inclusive, ele é imprescindível na construção dessa sintaxe.
O uso dessa construção é
irrestrito, exceto na inicialização de um atributo de uma classe.
Escape de caracteres literais• Ao usar as aspas simples como delimitador da
string, então a própria ‘ deve sofrer o escape (quando exibi-la)
Ex.: echo ’This is \’my\’ string’;• O mesmo acontece com as aspas duplas “• As chaves não exigem escape, mas então
como apresentar {$ ?
Ex.: echo "Here’s a literal brace + dollar sign: {\$";• Heredoc não requer escape quando houver
aspas simples e duplas
Transliteração• strtr - troca caracteres por outros:
echo strtr(‘abc’, ‘a’, ‘1’); //mostra 1bc
//suporta substituições múltiplas, através de array
$subst = array(
"1" => "UM",
"2" => "DOIS",
);
echo strtr('1234', $subst); //mostra UMDOIS34
strlen
• Obtém o tamanho da string, inclusive contando os espaços
Usando strings como arrays:$var = "Ari";
echo $var[1];
/* mostra “r” pois o índice é zero-based: o primeiro caracter é associado ao [0], o segundo em [1] e assim sucessivamente.*/
Comparações$v = "123Ari";
if ($v == 123){
echo ”É igual”;
}• Esse teste, espantosamente, retorna TRUE. PHP
faz um type casting automático da string $v convertendo-a para número.
• O mais indicado seria utilizar o exatamente === OU as funções específicas de comparação de strings:– strcmp– strcasecmp
Busca em strings
• Na nomenclatura usa-se os termos:– Needle – porção que se deseja encontrar– Haystack – string que supostamente contém o
needle. Numa tradução ao pé-da-letra seria literalmente localizar uma “agulha num palheiro”.
• A forma simples de pesquisa (e mais rápida) é feita através da família de funções str****.
$haystack = "abcdefg";
$needle = "abc";
if(strpos($haystack, $needle) !== false){
echo "Encontrou";
}
//strpos retorna a posição onde o needle se encontra (da esquerda pra direita) no haystack. Observe que “abc” aparece logo na primeira posição, portanto o índice é zero. Daí o uso do !== pois o 0 seria interpretado como false, via o type casting automático.
Variantes das funçõesBusca case-insensitive
echo stripos("Hello World", "hello");
//Encontra e mostra a posição zero
echo stristr("Hello My World", "my");
//Exibe "My World”
Faz uma busca reversa - do fim pro início
echo strrpos("123123", "123"); //Mostra 3
SubstituiçõesSubstitui todas as ocorrências que encontrar:
• echo str_replace(“World”, “Reader”, “Hello World”);• echo str_ireplace(“world”, “Reader”, “Hello World”);
//ambos devolvem Hello Reader
Obs.: permite um quarto parâmetro que guarda o número de trocas efetuadas.
Suportam também substituições simultâneas:
echo str_replace(array("Hello", "World"), array("Bonjour", "Monde"), "Hello World"); //mostra Bonjour Monde
echo str_replace(array("Hello", "World"), "Bye", "Hello World"); //mostra Bye Bye
Substituições (continuação)
echo substr_replace(“Hello World”, “Reader”, 6);
//substitui o conteúdo da posição 6 em diante
Aceita um quarto argumento que delimita a substituição. Ex.:
echo substr_replace("Canned tomatoes are good", "potatoes", 7, 8);
posição 6 (zero-based)
Inicia na posição 7 e avança 8 caracteres
Extração• substr aceita 3 parâmetros: a string na qual estamos
executando a operação, posição inicial e comprimento (opcional).
Obs.: a posição inicial pode ser um inteiro positivo (começando do início) ou negativo (começando pelo fim).
Ex.:
$x = "1234567";
echo substr($x, 0, 3); //123
echo substr($x, 1, 1); //2
echo substr($x, -2); //67
echo substr($x, 1); //234567
echo substr($x, -2, 1); //6
Formataçãonumber_format
• 1 argumento: sem decimais (arredonda) e separa com , cada grupo de mil. Ex.:
echo number_format("121000000.682");
//121,000,001
• 2 argumentos: separa o decimal com um . de acordo com as casas definidas
echo number_format("121000000.682", 4);
//121,000,000.6820• 4 argumentos: define o separador para os decimais e aos
agrupamentos de mil em mil
echo number_format("121000000.682", 4, "#", "@");
//121@000@000#6820
Formatação de valoressetlocale(LC_MONETARY, 'pt_br');
echo money_format("%.2n", "1234.414"); //1.234,41 R$
setlocale(LC_MONETARY, ’en_US');
echo money_format("%.2n", "1234.414"); //$1,234.41
setlocale(LC_MONETARY, 'fr_FR');
echo money_format("%.2n", "1234.414"); //1 234,41 Eu
.2 representa a precisão decimal
setlocale(LC_MONETARY, 'pt_br');
echo money_format(”%i", "1234.414"); //1.234,41 BRL
i representa a notação internacional
Formatação genérica$n = 123;
$f = 123.45;
printf ("%b olá %o", $n, $f); //1111011 olá 173
Cada especificação de conversão consiste no sinal de % seguido de um ou mais elementos descritos abaixo (seguindo a respectiva ordem)*:– Sinal– Padding– Alinhamento
– Lagura
– Precisão
– Tipo (veja a lista de tipos disponíveis no slide seguinte)
binário octal
* http://pt.php.net/manual/en/function.sprintf.php
Formatação genérica6.Tipo
b Exibe o número inteiro como binário
c Exibe em formato ASCII
d Exibe em número decimal
e ou E Notação científica. Ex.: 1.2e+2 ou 1.2E+2
u Número decimal sem sinal
f Número com ponto flutuante
F Ponto flutuante sem influência do setlocale
o Representa em formato octal
s Mostra no formato de string
x ou X Mostra em hexadecimal (minúsculas ou maiúsculas)
Expressões regulares• Representa um padrão (pattern)• Abstração de formato em símbolos• Método formal de representação• Regras• Metacaracteres que casam (match) num padrão• Compara esse padrão a outra string• Funções que manipulam as ocorrências, que se
utilizam de Expressões Regulares• Conhecidas também como: regexp, regex, RE e
ER
Expressões regulares
POSIX– ereg– ereg_replace– split
Perl Compatible Regular Expression (PCRE)– preg_match– preg_replace– preg_split
Para ignorar a diferença entremaiúsculas e minúsculas usa-seo próprio nome da função. Ex.:eregieregi_replacespliti
Padrão adotadona ZCE
Perl-compatible Regular Expressions• Comumente chamadas de PCRE• Poderoso mecanismo de busca e substituição• Inspirada na sintaxe e semântica do Perl• Adotada como padrão (ao invés do POSIX)• Formato exigido no exame ZCE• Começa e termina por delimitadores,
convencionados pela barra. Ex.: /padrão/
Obs.: o delimitador pode ser qualquer caracter, desde que ele não apareça com frequência. Nesse caso terá de ser escapado.
Metacaracteres PCREMetacaracter Equivalência
\d Número de 0-9
\D Tudo exceto números
\w Qualquer alfanumérico e _ (underscore)
\W Tudo exceto alfanumérico e _
\s Qualquer espaço, tabulação e nova linha
\S Tudo exceto espaço, tabulação e nova linha
. Tudo exceto nova linha
ˆ Compara no início da string
$ Compara no fim da string
Quantificadores PCRE
Quantificadores Significado
? Ocorre 0 ou 1 vez
* Ocorre 0 ou várias vezes
+ Ocorre 1 ou várias vezes
{,n} Ocorre até (no máximo) n vezes
{m,} Ocorre m ou mais vezes
{m,n} Ocorre entre m e n vezes
/ab?c/ faz o match com ac e abc, pois ? permite que o b apareça ou não/ab{1,3}c/ identifica abc, abbc e abbbc
• A expressão deve estar entre barras (delimitadores)Ex.: /ab[cd]e/
Identifica “abce” ou “abde”. Os colchetes permitem alternativas válidas.
Ex.: /ab[c-e\d]/Detecta abc, abd e abe MAIS um dígito qualquer (\d)
Detecção:preg_match_all($regexp, $string, $ocorrencias);
Substituição:preg_replace($regexp, $por, $string);
Exemplo de expressões regulares
Sub-expressões• São expressões regulares combinadas
formando uma expressão maior e mais complexa.
• Usa-se parênteses e é possível capturar essa equiparação, quando ocorrer, de forma individualizada
Ex.: /a(bc.)+e/
Essa expressão busca a letra a, seguida bc mais um caracter, e que essa sub-expressão repita uma ou mais vezes (+), seguida de e
Checagem e Extração
$regex = "#^(\w+)\s(\w+)#";
$matches = array();
if(preg_match($regex, “Ari Junior”, $matches)){
var_dump($matches);
}
Delimitador não usual
Cada sub-pattern é associado a um índice de $matches, começando em 1.
Substituições
$body = "[b]Make Me Bold![/b]";
$regex = "@\[b\](.*?)\[/b\]@i";
$replacement = "<b>$1</b>";
$body = preg_replace($regex, $replacement, $body);
echo $body;
Análise da expressão:\[b\] faz o escape do colchete pois ele tem uma função especial dentro das expressões regulares. Nesse caso, se deseja detectá-lo literalmente.
$1 é substituído pela primeira sub-expressão (.*?)
i é um modificador e transformao padrão em case-insensitive.Consulte os demais em php.net*
* http://pt.php.net/manual/en/reference.pcre.pattern.modifiers.php
Críticas, sugestões e idéiasE-mail: [email protected]
MSN: [email protected]
Skype: stopassola
Google Talk: [email protected]
Redes sociais:
http://www.orkut.com/Main#Profile?rl=mp&uid=15132509634963996685
http://www.facebook.com/arijunior
http://twitter.com/stopassola
http://pt.linkedin.com/in/stopassola