treinamento php: strings & patterns
TRANSCRIPT
![Page 2: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/2.jpg)
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"
![Page 3: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/3.jpg)
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
![Page 4: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/4.jpg)
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*
![Page 5: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/5.jpg)
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)
![Page 6: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/6.jpg)
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.
![Page 7: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/7.jpg)
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
![Page 8: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/8.jpg)
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
![Page 9: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/9.jpg)
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.*/
![Page 10: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/10.jpg)
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
![Page 11: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/11.jpg)
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****.
![Page 12: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/12.jpg)
$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.
![Page 13: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/13.jpg)
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
![Page 14: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/14.jpg)
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
![Page 15: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/15.jpg)
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
![Page 16: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/16.jpg)
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
![Page 17: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/17.jpg)
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
![Page 18: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/18.jpg)
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
![Page 19: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/19.jpg)
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
![Page 20: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/20.jpg)
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)
![Page 21: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/21.jpg)
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
![Page 22: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/22.jpg)
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
![Page 23: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/23.jpg)
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.
![Page 24: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/24.jpg)
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
![Page 25: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/25.jpg)
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
![Page 26: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/26.jpg)
• 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
![Page 27: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/27.jpg)
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
![Page 28: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/28.jpg)
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.
![Page 29: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/29.jpg)
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
![Page 30: Treinamento PHP: Strings & Patterns](https://reader030.vdocument.in/reader030/viewer/2022020101/5598f9711a28ab73278b4827/html5/thumbnails/30.jpg)
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