Treinamento PHP: Strings & Patterns

Post on 05-Jul-2015

639 views 5 download

transcript

Treinamento em PHP

Strings & Patterns

Ari Stopassola Juniorstopassola@acimainteractive.com

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: stopassola@acimainteractive.com

MSN: stopassola@hotmail.com

Skype: stopassola

Google Talk: arijunior@gmail.com

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