sábado, 28 de dezembro de 2013

Postgresql - Parte 1

PostgreSQL


PostgreSQL
PostgreSQL logo
Desenvolvedor PostgreSQL Global Development Group
Lançado em 1 de maio de 1995 (0.0.1)
Versão estável 9.3.21 (5 de dezembro de 2013; há 3 semanas e 2 dias)
Idioma(s) 24 idiomas2
Escrito em C, Perl, Sh
Sistema Operacional Multiplataforma
Gênero(s) SGBD
Licença Licença BSD
Estado do desenvolvimento Ativo
Página oficial www.postgresql.org ou www.postgresql.org.br
Portal das Tecnologias de informação
PostgreSQL é um sistema gerenciador de banco de dados objeto relacional (SGBDOR), desenvolvido como projeto de código aberto.



Características

Hoje, o PostgreSQL é um dos SGBDs (Sistema Gerenciador de Bancos de Dados) de código aberto mais avançados, contando com recursos como:

Histórico

O PostgreSQL é um dos resultados de uma ampla evolução que se iniciou com o projeto Ingres, desenvolvido na Universidade de Berkeley, Califórnia. O líder do projeto, Michael Stonebraker, um dos pioneiros dos bancos de dados relacionais, deixou a universidade em 1982 para comercializar o Ingres, porém retornou a ela logo em seguida. Após seu retorno a Berkeley, em 1985, Stonebraker começou um projeto pós-Ingres com o objetivo de resolver problemas com o modelo de banco de dados relacional. O principal problema era a incapacidade do modelo relacional compreender “tipos” (atualmente, chamados de objetos), ou seja, combinações de dados simples que formam uma única unidade.
O projeto resultante, chamado Postgres, era orientado a introduzir a menor quantidade possível de funcionalidades para completar o suporte a tipos. Estas funcionalidades incluíam a habilidade de definir tipos, mas também a habilidade de descrever relações - as quais até este momento eram amplamente utilizadas, mas completamente mantidas pelo usuário. No Postgres, o banco de dados "compreendia" as relações e podia obter informações de tabelas relacionadas utilizando regras.
Iniciando em 1986, a equipe divulgou uma série de documentos descrevendo a base do sistema e em 1988 o projeto possuía um protótipo funcional. A versão 1 foi liberada para um grupo pequeno de usuários em junho de 1989, seguida pela versão 2 com um sistema de regras reescrito em junho de 1990. Para a versão 3, liberada em 1991, o sistema de regras foi reescrito novamente, mas também foram adicionados suporte para múltiplos gerenciadores de armazenamento e um melhorado motor de consultas. Já em 1993, Postgres havia crescido imensamente em popularidade e possuía uma grande demanda por suporte e por novas funcionalidades. Após a liberação da versão 4, a qual era uma simples versão de limpeza, o projeto foi oficialmente abandonado pela Universidade de Berkeley.
Entretanto, devido ao fato do seu código fonte estar sob uma licença BSD, o seu desenvolvimento foi continuado. Em 1994, dois estudantes , Andrew Yu e Jolly Chen, adicionaram um interpretador SQL para substituir a linguagem QUEL (desenvolvida para o Ingres) e o projeto foi renomeado para Postgres95. Com a divulgação de seu código pela Internet, Postgres95 iniciou uma nova vida como software open source.
Em agosto de 1996, Marc Fournier, Bruce Momjian e Vadim B. Mikheev lançaram a primeira versão externa da Universidade de Berkeley e deram início à tarefa de estabilizar o código herdado. Também em 1996, o projeto foi renomeado para PostgreSQL a fim de refletir a nova linguagem de consulta ao banco de dados: SQL. A primeira versão de PostgreSQL, a 6.0, foi liberada em janeiro de 1997. Desde então, um grupo de desenvolvedores e de voluntários de todo o mundo, coordenados pela Internet, têm mantido o software e desenvolvido novas funcionalidades.
As principais características acrescentadas nas versões 6.x são o en:MVCC (Multiversion Concurrency Control – Controle de Concorrência Multiversões), melhorias no SQL e novos tipos de dados nativos (novos tipos de datas e hora e tipos geométricos).
Em maio de 2000 foi liberada a versão 7.0. As versões 7.x trouxeram as seguintes novas funcionalidades: Write-Ahead Log (WAL), esquemas SQL, outer joins, suporte a IPv6, indexação por texto, suporte melhorado a SSL e informações estatísticas do banco de dados.
A versão 8.0 foi lançada em janeiro de 2005 e entre outras novidades, foi a primeira a ter suporte nativo para Microsoft Windows (tradicionalmente, o PostgreSQL só rodava de forma nativa em sistemas Unix e, em sistemas Windows - através da biblioteca Cygwin). Dentre as muitas novidades da versão 8.x, pode-se destacar o suporte a tablespaces, savepoints, point-in-time recovery, roles e Two-Phase Commit (2PC). Em setembro de 2010 foi lançada a versão mais recente: 9.0.

Desenvolvimento do Projeto

O PostgreSQL é um projeto open source coordenado pelo PostgreSQL Global Development Group. Embora as atividades do grupo sejam patrocinadas por diversas organizações de todo o mundo, seu modelo de desenvolvimento é o modelo Bazar (originalmente apresentado em A Catedral e o Bazar de Eric S. Raymond).
Portanto, o desenvolvimento do PostgreSQL é feito por um grupo de desenvolvedores, em sua maioria voluntários, espalhados por todo o mundo e que se comunicam via Internet. Logo, trata-se, de um projeto direcionado pela comunidade de desenvolvedores e de usuários, a qual qualquer pessoa pode se juntar, bastando se inscrever em listas de discussão e participar delas.
Voluntários interessados em contribuir com o projeto também podem consultar as sugestões de tarefas de desenvolvimento de novas funções e de correções de erros que são publicadas na lista TODO ou apresentar suas próprias sugestões. O código desenvolvido é submetido à equipe do projeto que pode aceitá-lo e incluí-lo nas novas versões ou recusá-lo. Voluntários também podem colaborar gerando documentação ou realizando traduções!
As ferramentas utilizadas para o apoio ao desenvolvimento são o sistema de gestão de fontes CVS (Concurrent Version System), listas de discussão, servidor de news e salas de bate-papo (IRC).

Estruturas de Decisão

O Projeto PostgreSQL é desenvolvido e direcionado pela sua comunidade de desenvolvedores e de usuários. Para coordenar o projeto há uma equipe central (core team) composta por sete desenvolvedores e um grupo de committers CVS. O código fornecido por voluntários é avaliado e aceito ou rejeitado pelos committers.
Este modelo de desenvolvimento de software, baseado no modelo Bazar originalmente apresentado em A Catedral e o Bazar de Eric S. Raymond, possibilita o desenvolvimento de software com qualidade devido, principalmente, a permitir:
  • Tratar usuários como parceiros e/ou desenvolvedores. Eles contribuem diretamente com o desenvolvimento do software apresentando os problemas enfrentados, suas necessidades, suas sugestões de solução e, até mesmo, seu próprio código fonte de solução. Assim, usuários auxiliam de forma pró-ativa nas melhorias e na depuração do software.
  • Reutilizar código fonte.
  • Lançar rapidamente e frequentemente novas versões. Com uma base ampla de usuários testadores do software, os eventuais problemas são rapidamente identificados e sugestões de solução também aparecem com rapidez.

Estado Atual

Além de doações, o projeto PostgreSQL se sustenta pelo patrocínio de diversas empresas, entre as quais se destacam: Fujitsu, Hub.Org, NTT Group, Red Hat, Skype e SRA.
O software tem adquirido prestígio na comunidade Linux, tendo recebido diversas vezes o prêmio Linux Journal Editor's Choice de melhor sistema de gerenciamento de banco de dados (SGBD).
Uma diversidade de módulos adicionais está disponível através do pgfoundry.
A aceitação do PostgreSQL tem se ampliado para além da comunidade de código aberto. Há entre os seus usuários grandes empresas internacionais, órgãos governamentais de vários países e universidades de prestígio mundial. Existe uma lista dos principais usuários no Brasil e no mundo e, também, há alguns estudos de caso de aplicações que utilizam o PostgreSQL.

Radiografia

Nesta seção são apresentadas medidas e estimativas referentes ao PostgreSQL 8.3.0 obtidos pelo SLOCCount de en:David A. Wheeler. Esta versão de PostgreSQL apresenta mais de 570 mil linhas de código, o que segundo o modelo COCOMO exigiria um esforço estimado de pouco mais de 157 pessoas-ano para o seu desenvolvimento. Estima-se que o tempo necessário para uma empresa desenvolver um software deste porte é de 3 anos e meio (aproximadamente 43 meses), o que corresponderia a cerca de 43 programadores trabalhando em paralelo. Considerando que o salário médio de um programador nos EUA é de cerca de US$ 56.286,00 por ano, e multiplicando por 2,4 para considerar custos adicionais além do salário dos programadores, o custo estimado para o desenvolvimento de um software do porte do PostgreSQL 8.3.0 é de US$ 21.220.945,00.
Estado atual do PostgreSQL
Página web http://www.postgresql.org/
Início do projeto 1985
Licença Licença BSD
Versão atual 9.0
Data da versão atual 4 de fevereiro de 2008
Linhas de código fonte 571.821
Esforço estimado de desenvolvimento
(pessoa-ano / pessoa-mês)
157,09 / 1.855,10
Estimativa de tempo de desenvolvimento (anos) 3,66
Estimativa de nº de desenvolvedores em paralelo 42,39
Estimativa de custo (US$) 21.220.945,00
A principal linguagem de programação utilizada no desenvolvimento do PostgreSQL 8.3.0 é o ANSI C. Entretanto, também são utilizadas minoritariamente outras linguagens conforme mostra a tabela.

Linguagens de Programação utilizadas no PostgreSQL 8.3.0
Linguagem Linhas de código  %
ANSI C 541.312 94,66
yacc 15.527 2,72
lex 5.580 0,98
sh 5.412 0,95
perl 3.913 0,68
asm 65 0,01
python 12 0,00

PHP Instalando e configurando (Windows)

Considerações Gerais sobre Instalação

Antes de começar a instalar o PHP, primeiro você deve saber o que você deseja fazer com ele. Existem três principais formas de se usar o PHP, como descrito na seção O que o PHP pode fazer? do manual:
  • Websites e aplicações web (script do lado do servidor)
  • Scripts para linha de comando
  • Aplicações de Desktop (GUI)
Para a primeira forma, e mais comum, você precisa de três coisas: o prório PHP, um servidor web e um cliente (browser) web. Você provavelmente já tem um browser, e dependendo da configuração do seu sistema operacional, vocêo pode tambem ter um servidor web (Ex.: Apache no Linux e MacOS X; IIS no Windows). Você também pode alugar um host em uma companhia qualquer. Dessa maneira, você não precisa configurar nada por conta própria, apenas escrever os seus scripts PHP, enviar (upload) para o servidor que você alugou, e ver os resultados no seu browser.
No caso de você instalar o servidor e o PHP por contra própria, você tem duas escolhas para o método de conexão do PHP com o servidor. Para muitos servidores o PHP tem uma interface direta de módulo (também chamada de SAPI). Entre esses servidores estão Apache, Microsoft Internet Information Server, Netscape e iPlanet. Muitos outros servidores têm suporte para ISAPI, a interface de módulo da Microsoft (OmniHTTPd por exemplo). Se o PHP não tiver suporte de módulo para o seu servidor web, você também pode usá-lo como processador CGI ou FastCGI. Isso significar configurar seu servidor para usar executáveis CGI do PHP para processar todas as requisições à arquivos PHP no servidor.
Se você também estiver interessado em usar o PHP para criar scripts em linha de comandos (Ex.: criar scripts que geram imagens enquanto estão offline, ou processar arquivos de texto dependendo de alguns argumentos que você passar ao script), você pode precisar do executável de linha de comando. Para mais informações, leia a seção sobre criando aplicações de linha de comando com o PHP. Nesse caso, vocêo não precisa de servidor nem de um browser.
Com o PHP, você também pode criar aplicações para desktop com interface gráfica (GUI) usando a extenção PHP-GTK. Isso é uma abordagem completamente diferente da criação de páginas web, já que a saída não é em HTML, mas o manuseio de janelas e objetos dentro delas. Para mais informações sobre PHP-GTK, por favor »  visite o site dedicado à essa extensão. PHP-GTK não é inclusa na distribuição oficial do PHP.
Por enquanto, essa seção trata da instalação do PHP em servidores web no Unix e Windows como módulos dos servidores e executáveis CGI. Você também pode encontrar inforamação sobre executáveis de linha de comando nas seções seguintes.
O código fonte do PHP e distribuições binárias para Windows podem ser encontradas em » http://www.php.net/downloads.php. Nós recomentandos que você escolha um » mirror mais próximo de vocêo para baixar as distribuições. 

Instalador para Windows (PHP 5.4 )

O Instalador do PHP para Windows para versões recentes do PHP é feito usando a tecnologia MSI através do Wix Toolkit (» http://wix.sourceforge.net/). Ele instala e configura o PHP e todas as extensões PECL integradas, assim como configura muitos dos web servers mais populares, como IIS, Apache, e Xitami.
Primeiro, instale seu servidor HTTP (web) predileto no seu sistema e verifique que ele funciona. Então prossiga com um dos seguintes tipos de instação.

Instalação Normal

Execute o instalador MSI e siga as instruções fornecidas pelo programa. Ele primeiro perguntará qual Web Server você deseja configurar, assim como qualquer detalhe de configuração necessário.
Depois você deve selecionar quais funcionalidades e extensões você deseja instalar e habilitar. Para cada item disponível, você pode selecionar "Será instalado no disco local" no menu para determinar quais funcionalidades serão instaladas. Selcionado "Funcionalidade inteira será instalada no disco local", você poderá instalar todas as sub-funcionalidades vinculadas à funcionalidade (por exemplo, selecionar essa opção na extensão "PDO" você instalará todos os drivers PDO).
Aviso
Não é recomendado instalar todas as extensões, já que muitas dependem de extensões externas ao PHP para funcionarem corretamente. Ao invés, use o Installation Repair Mode (Modo de Reparo) que pode ser acionado através da opção Add/Remove Programs (Adicionar/Remover Programas) do painel de controle para habilitar ou desabilitar extensões após a instalação.
O instalador então instala o PHP para ser usado no Windows e o arquivo php.ini, e configura certos servidores web para usá-lo. O instalador configura, atualmente, o IIS, Apache, Xitami e Sambar; se você estiver usando um servidor web diferente, você precisa configurá-lo manualmente.

Instalação silenciosa

O instalador também suporta um modo silencioso, que é útil para administradores de sistema implantarem o PHP facilmente. Para usar o modo silencioso:
msiexec.exe /i php-VERSION-win32-install.msi /q
Você pode controlar o diretório de instalação passando ele como parâmetro de linha de comando. Por exemplo, para instalar em e:\php:
msiexec.exe /i php-VERSION-win32-install.msi /q INSTALLDIR=e:\php
Você também pode usar a mesma sintaxe para especificar o diretório de configuração do Apache (APACHEDIR), do Sambar (SAMBARDIR), e do Xitami (XITAMIDIR).
Você pode especificar quais funcionalidades instalar. Por exemplo, para instalar a extensão mysqli e o executável CGI:
msiexec.exe /i php-VERSION-win32-install.msi /q ADDLOCAL=cgi,ext_php_mysqli
A lista atual de funcionalidades para instalação é a seguinte:
MainExecutable - php.exe executable
ScriptExecutable - php-win.exe executable
ext_php_* - the various extensions ( for example: ext_php_mysql for MySQL )
apache13 - Apache 1.3 module
apache20 - Apache 2.0 module
apache22 - Apache 2,2 module
apacheCGI - Apache CGI executable
iis4ISAPI - IIS ISAPI module
iis4CGI - IIS CGI executable
NSAPI - Sun/iPlanet/Netscape server module
Xitami - Xitami CGI executable
Sambar - Sambar Server ISAPI module
CGI - php-cgi.exe executable
PEAR - PEAR installer
Manual - PHP Manual in CHM Format
Para mais informações sobre instalando usando instaladores MSI a partir da linha de comando, visite » http://msdn.microsoft.com/en-us/library/aa367988.aspx

Atualizado o PHP com o instalador

Para fazer atualização, execute o instalador ou graficamente, ou a partir da linha de comando normalmente. O instalador lerá as opções atuais instalação, remover a instalação velha e reinstalará o PHP com as mesmas opções de antes. É recomendado que você use esse método para manter o PHP atualizado ao invés substituir manualmente os arquivos no diretório de instalação.

Passos para Instalação Manual

Esse guia de instalação ajudará você a instalar manualmente e configurar o PHP em um servidor web no Microsoft Windows. Para instruções de como utilizar o instalador do PHP para instalar e configurar um servidor web no Windows, veja o Instalador Windows (PHP 5.2 e posteriores).

Selecionando e baixando o pacote de distribuição do PHP

Baixe o binário do PHP em ZIP do link » PHP para Windows: Binários e fontes. Existem várias versões diferentes do pacote zip - escolha a versão que se encaixa com o servidor web sendo utilizado:
  • Se o PHP for usado com IIS, então escolha o PHP 5.3 VC9 Non Thread Safe ou PHP 5.2 VC6 Non Thread Safe;
  • Se o PHP for usado com IIS7 ou maior e PHP 5.3+, então os binários da VC9 devem ser utilizados.
  • Se o PHP for usado com Apache 1 ou Apache 2, então escolha o PHP 5.3 VC6 ou PHP 5.2 VC6.
Nota:
As versões VC9 são compiladas com o compilador do Visual Studio 2008 e têm melhorias de performance e estabilidade. As versões VC9 requerem que você tenha instalado o » Microsoft 2008 C++ Runtime (x86) ou o » Microsoft 2008 C++ Runtime (x64).

Estrutura e conteúdo do pacote PHP

Descompacte o conteúdo do arquivo zip em um diretório de sua escolha, por exemplo C:\PHP\. A estrutura de arquivos e diretórios extraídos serão conforme mostrado abaixo:
Exemplo #1 Estrutura do pacote PHP 5
c:\php
   |
   +--dev
   |  |
   |  |-php5ts.lib                 -- php5.lib em versão non thread safe
   |
   +--ext                          -- DLLS de extensões para o PHP
   |  |
   |  |-php_bz2.dll
   |  |
   |  |-php_cpdf.dll
   |  |
   |  |-...
   |
   +--extras                       -- vazio
   |
   +--pear                         -- cópia inicial do PEAR
   |
   |
   |-go-pear.bat                   -- script de setup do PEAR
   |
   |-...
   |
   |-php-cgi.exe                   -- executável CGI
   |
   |-php-win.exe                   -- executa scripts sem um prompt de comando aberto
   |
   |-php.exe                       -- executável PHP de Linha de Comando (CLI)
   |
   |-...
   |
   |-php.ini-development           -- configurações php.ini padrão
   |
   |-php.ini-production            -- configurações php.ini recomendadas
   |
   |-php5apache2_2.dll             -- não existe na versão non thread safe
   |
   |-php5apache2_2_filter.dll      -- não existe na versão non thread safe
   |
   |-...
   |
   |-php5ts.dll                    -- principal DLL do PHP ( php5.dll em versão non thread safe)
   | 
   |-...

Abaixo está a lista de módulos e executáveis incluídos na distrubuição zip:
  • go-pear.bat - o script de setup do PEAR. Veja a » Instalação (PEAR) para mais detalhes.
  • php-cgi.exe - executável CGI que pode ser usado quando rodar o PHP no IIS via CGI ou FastCGI.
  • php-win.exe - executável do PHP para executar scripts PHP sem usar uma janela de linha de comando (por exemplo aplicativos PHP que usam a interface (GUI) do Windows).
  • php.exe - executável do PHP para executar scripts PHP dentro de uma interface de linha de comando (CLI).
  • php5apache2_2.dll - módulo para o Apache 2.2.X.
  • php5apache2_2_filter.dll - filtro para o Apache 2.2.X.

Alterando o arquivo php.ini

Depois que o conteúdo do pacote php foi extraído, copie o php.ini-production para php.ini dentro da mesma pasta. Se necessário, também é possível colocar o php.ini em qualquer outra localização de sua escolha, mas isso requer configurações adicionais conforme descrito em Configuração do PHP.
O arquivo php.ini diz para o PHP como se configurar, e como trabalhar com o ambiente em que ele está rodando. Aqui estão algumas configurações do arquivo php.ini que ajudarão o PHP a funcionar melhor com o Windows. Algumas delas são opcionais. Existem muitas outras diretivas que podem ser relevantes para o seu ambiente - veja a lista de diretivas do php.ini para mais informações.
Diretivas requeridas:
  • extension_dir = <caminho para o diretório de extesões> - A extension_dir precisa apontar para o diretório onde as extensões do PHP estão guardadas. O caminho pode ser absoluto (ex: "C:\PHP\ext") ou relativo (ex: ".\ext"). Extensões que estão listadas mais abaixo no arquivo php.ini precisam estar localizadas em extension_dir.
  • extension = xxxxx.dll - Para cada extensão que você deseja ativar, você precisa de uma diretiva "extension=" correspondente que diga o PHP que extensão no extension_dir para carregar durante a inicialização.
  • log_errors = On - O PHP tem um dispositivo de log de erros que pode ser usado para enviar erros para um arquivo, ou um serviço (ex: syslog) e funciona em conjunto com a diretiva abaixo error_log. Quando rodando sob o IIS, a log_errors pode ser ativada, com um error_log válido.
  • error_log = <caminho para o arquivo de log de erro> - A error_log deve especificar o caminho absoluto, ou relativo para o arquivo onde os erros do PHP devem ser logados. O servidor web precisa ter permissão de escrita para esse arquivo. Os caminhos mais comuns para esse arquivo são em diretórios TEMP, por exemplo "C:\inetpub\temp\php-errors.log".
  • cgi.force_redirect = 0 - Essa diretiva é requerida para rodar sob o IIS. É uma diretiva de segurança requerida por muitos outros servidores web. Entretanto, ativá-la sob o IIS fará com que o motor do PHP falhe no Windows.
  • cgi.fix_pathinfo = 1 - Isso permite que o PHP acesse a informação de caminho real dentro das especificações CGI. A implementação de IIS e FastCGI precisa que isso seja configurado.
  • fastcgi.impersonate = 1 - O FastCGI sob IIS tem a habilidade de imitar tokens de segurança do cliente que está chamando. Isso permite que o IIS defina o contexto de segurança da chamada.
  • fastcgi.logging = 0 - O log de FastCGI deve ser desativado no IIS. Se for deixado ativo, qualquer mensagem de qualquer classe é tratada pelo FastCGI como condições de erro que farão o IIS gerar uma excessão HTTP 500.
Diretivas opcionais
  • max_execution_time = ## - Essa diretiva diz ao PHP qual o máximo de tempo que ele pode gastar executando um determinado script. O padrão é 30 segundos. Aumente o valor dessa diretiva se as aplicações demoram muito tempo para executar.
  • memory_limit = ###M - A quantidade de memória disponível para o processo do PHP, em Megabytes. O padrão é 128, que é o suficiente para a maioria das aplicações PHP. Algumas mais complexas podem precisar de mais.
  • display_errors = Off - Essa diretiva diz ao PHP para incluir, ou não, qualquer mensagem de erro na corrente que ele retorna ao servidor Web. Se isso for configurado para "On", então o PHP irá enviar ao web server qualquer classe de erro que você definir na diretiva error_reporting como parte da corrente de erro. Por razões de segurança é recomendado que seja configurada para "Off" em servidores de produção, para não revelar qualquer informação de segurança sensível que é geralmente incluída nas mensagens de erro.
  • open_basedir = <caminhos para diretórios, separados por ponto-e-vírgula>, ex: openbasedir="C:\inetpub\wwwroot;C:\inetpub\temp". Essa diretiva especifica os caminhos para os diretórios onde o PHP pode executar operações de sistema de arquivos. Qualquer operação fora desses caminhos especificados resultará em um erro. Essa diretiva é especificamente útil para travar a instalação do PHP dentro de ambientes de hospedagem compartilhados para previnir scripts PHP de acessarem quaisquer arquivos fora do diretório raiz do web site.
  • upload_max_filesize = ###M e post_max_size = ###M - O tamanho máximo permitido de um arquivo subido e dados de post, respectivamente. Os valores dessas diretivas devem ser aumentados em aplicações PHP que precisam fazer grandes uploads, como por exemplo arquivo de fotos e vídeos.
O PHP agora está configurado no seu sistema. O próximo passo é escolher um servidor web, e fazer com que ele rode o PHP. Escolha um servidor na tabela de conteúdos.
Além de rodar o PHP em um servidor web, o PHP pode rodar a partir da linha de comando assim como um script .BAT. Veja PHP de linha de comando no Microsoft Windows para mais detalhes. 

Instalação simplificada 

http://www.php.net/downloads.php

Baixe o arquivo no formato .ZIP, o qual já contém todas as extensões da linguagem. Atualmente (Abr/2002), a versão mais recente do PHP disponível para Windows é a 4.1.2 e o tamanho do seu pacote .ZIP está em torno de 5MB. Este arquivo zipado deverá ter o seguinte nome: php-x.x.x-Win32.zip, onde x.x.x é a versão da linguagem.
Descompacte este pacote para uma pasta qualquer no seu disco. Vamos considerar que a pasta de destino dos arquivos seja C:\PHP.
Após a descompactação, a estrutura de diretórios do PHP deve ficar como indicado na figura abaixo:





3.2. Configurando o PHP
Copie o arquivo php.ini-dist, que se encontra na pasta C:\PHP, para a pasta do Windows (geralmente C:\Windows). Renomeie-o para php.ini e em seguida abra-o. Localize o seguinte texto dentro deste arquivo: "extension_dir" e altere o valor desta entrada para o nome da pasta com os arquivos das extensões do PHP, que no nosso caso é "c:\php\extensions". Após a alteração, esta seção do arquivo deverá parecer como a seguir:


Salve e feche este arquivo.
Copie também o arquivo php4ts.dll, que se encontra na pasta C:\PHP, para a pasta C:\Windows\System, no caso de Windows95/98/ME/XP, ou para a pasta C:\WINNT\System32, no caso de WindowsNT/2000.


3.3. Configurando o Apache para trabalhar com o PHP
Para que o servidor Web Apache possa reconhecer o PHP e redirecionar as páginas escritas nesta linguagem para o seu interpretador, precisaremos adicionar algumas configurações no arquivo de configuração do Apache, o httpd.conf, que está localizado na pasta \conf deste servidor Web. Se você não tiver alterado a localização padrão dos arquivos do servidor Web Apache durante a instalação, o caminho completo para este arquivo é o seguinte:

C:\Arquivos de programas\Apache Group\Apache\conf\httpd.conf

Adicione as seguintes linhas NO FINAL deste arquivo:

AddType application/x-httpd-php .php
LoadModule php4_module c:/php/sapi/php4apache.dll

Salve este arquivo e, em seguida, pare e re-inicie o Apache. Na janela do Apache, deverá aparecer uma string indicando que o PHP foi carregado juntamente com o servidor Web, como indicado abaixo:

Em plataformas Windows NT/2000, vá para a janela do gerenciador de serviços e pare e re-inicie o serviço do Apache. Nesta janela, no item correspondente à descrição do serviço do Apache, deverá ser exibido uma descrição semelhante a da indicada na figura acima.


3.4. Testando a instalação do PHP
Para testar a instalação do PHP, crie um arquivo qualquer com extensão .php (info.php, por exemplo) na pasta base do seu servidor Web Apache (htdocs) e, dentro dele digite o seguinte código:

<? phpinfo(); ?>

Salve-o e em seguida acesse-o através do servidor Web local, digitando o seguinte endereco no seu navegador (certifique-se de que o servidor Apache esteja em execução):

http://localhost/info.php

Uma tela com informações sobre a configuração do PHP deverá ser exibida, como indicado abaixo:


Feito isto, a instalação e configuração básica do Apache e do PHP no Windows terá sido finalizada.



4. Considerações Finais

É extremamente aconselhável a leitura da sessão do manual do PHP que trata sobre a instalação e configuração, em:

http://www.php.net/manual/en/installation.php
 
Fontes: http://us3.php.net/manual/pt_BR/install.php e http://unix.wmonline.com.br/php/tutoriais/instalacao_apache/instalacao.htm

sexta-feira, 27 de dezembro de 2013

Expressão regular (Regex)

Em ciência da computação, uma expressão regular (ou o estrangeirismo regex, abreviação do inglês regular expression) provê uma forma concisa e flexível de identificar cadeias de caracteres de interesse, como caracteres particulares, palavras ou padrões de caracteres. Expressões regulares são escritas numa linguagem formal que pode ser interpretada por um processador de expressão regular, um programa que ou serve um gerador de analisador sintático ou examina o texto e identifica partes que casam com a especificação dada.
O termo deriva do trabalho do matemático norte-americano Stephen Cole Kleene, que desenvolveu as expressões regulares como uma notação ao que ele chamava de álgebra de conjuntos regulares. Seu trabalho serviu de base para os primeiros algoritmos computacionais de busca, e depois para algumas das mais antigas ferramentas de tratamento de texto da plataforma Unix.
O uso atual de expressões regulares inclui procura e substituição de texto em editores de texto e linguagens de programação, validação de formatos de texto (validação de protocolos ou formatos digitais), realce de sintaxe e filtragem de informação.

Conceitos básicos

Uma expressão regular (ou, um padrão) descreve um conjunto de cadeias de caracteres, de forma concisa, sem precisar listar todos os elementos do conjunto. Por exemplo, um conjunto contendo as cadeias "Handel", "Händel" e "Haendel" pode ser descrito pelo padrão H(ä|ae?)ndel. A maioria dos formalismos provê pelo menos três operações para construir expressões regulares.
A primeira delas é a alternância, em que uma barra vertical (|) separa alternativas. Por exemplo, psicadélico|psicodélico pode casar "psicadélico" ou "psicodélico". A segunda operação é o agrupamento, em que parênteses ((, )) são usados para definir o escopo e a precedência de operadores, entre outros usos. Por exemplo, psicadélico|psicodélico e psic(a|o)délico são equivalentes e ambas descrevem "psicadélico" e "psicodélico". Por fim, a terceira operação é a quantificação (ou repetição). Um quantificador após um token (como um caractere) ou um agrupamento especifica a quantidade de vezes que o elemento precedente pode ocorrer. Os quantificadores mais comuns são ?, * e +. O ponto de interrogação indica que há zero ou uma ocorrência do elemento precedente. Por exemplo, ac?ção casa tanto "acção" quanto "ação". Já o asterisco indica que há zero ou mais ocorrências do elemento precedente. Por exemplo, ab*c casa "ac", "abc", "abbc", "abbbc", e assim por diante. Por fim, o sinal de adição indica que há uma ou mais ocorrências do elemento precedente. Por exemplo, ab+c casa "abc", "abbc", "abbbc", e assim por diante, mas não "ac".
Essas construções podem ser combinadas arbitrariamente para formar expressões complexas, assim como expressões aritméticas com números e operações de adição, subtração, multiplicação e divisão. De forma geral, há diversas expressões regulares para descrever um mesmo conjunto de cadeias de caracteres. A sintaxe exata da expressão regular e os operadores disponíveis variam entre as implementações.

História

A origem das expressões regulares estão na teoria dos autômatos e na teoria das linguagens formais, e ambas fazem parte da teoria da computação. Esses campos estudam modelos de computação (autômatas) e formas de descrição e classificação de linguagens formais. Na década de 1950, o matemático Stephen Cole Kleene descreveu tais modelos usando sua notação matemática chamada de "conjuntos regulares", formando a álgebra de Kleene. A linguagem SNOBOL foi uma implementação pioneira de casamento de padrões, mas não era idêntica às expressões regulares. Ken Thompson construiu a notação de Kleene no editor de texto QED como uma forma de casamento de padrões em arquivos de texto. Posteriormente, ele adicionou essa funcionalidade no editor de texto Unix ed, que resultou no uso de expressões regulares na popular ferramenta de busca grep. Desde então, diversas variações da adaptação original de Thompson foram usadas em Unix e derivados, incluindo expr, AWK, Emacs, vi e lex.
As expressões regulares de Perl e Tcl foram derivadas da biblioteca escrita por Henry Spencer, e no Perl a funcionalidade foi expandida posteriormente.1 Philip Hazel desenvolveu a PCRE (Perl Compatible Regular Expressions), uma biblioteca usada por diversas ferramentas modernas como PHP e o servidor Apache. Parte do desenvolvimento do Perl 6 foi melhorar a integração das expressões regulares de Perl, e aumentar seu escopo e funcionalidade para permitir a definição de gramáticas de expressão de analisadores sintáticos.2 O resultado foi uma mini-linguagem, as regras do Perl 6, usada para definir a gramática do Perl 6 assim como fornecer uma ferramenta para programadores da linguagem. Tais regras mantiveram as funcionalidades de expressões regulares do Perl 5.x, mas também permitiram uma definição BNF de um analisador sintático descendente recursivo.
O uso de expressões regulares em normas de informação estruturada para a modelagem de documentos e bancos de dados começou na década de 1960, e expandiu na década de 1980 quando normas como a ISO SGML foram consolidadas.

Teoria de linguagens formais

Expressões regulares podem ser expressas através da teoria de linguagens formais. Elas consistem de constantes e operadores que denotam conjuntos de cadeias de caracteres e operações sobre esses conjuntos, respectivamente. Dado um alfabeto finito Σ, as seguintes constantes são definidas:
  • (conjunto vazio) denotando o conjunto
  • (cadeia de caracteres vazia) ε denotando o conjunto {ε}
  • (literal) a em Σ denotando o conjunto {a}
As seguintes operações são definidas:
  • (concatenação) RS denotando o conjunto { αβ | α em R e β em S }. Por exemplo, {"ab", "c"}{"d", "ef"} = {"abd", "abef", "cd", "cef"}.
  • (alternância) R|S denotando o conjunto união de R e S. Usa-se os símbolos , + ou para alternância ao invés da barra vertical. Por exemplo, {"ab", "c"}{"dv", "ef"} = {"ab", "c", "dv", "ef"}
  • (Fecho de Kleene) R* denotando o menor superconjunto de R que contém ε e é fechado sob concatenação. Esse é o conjunto de todas as cadeias de caracteres que podem ser construídas ao concatenar zero ou mais cadeias em R. Por exemplo, {"ab", "c"}* = {ε, "ab", "c", "abab", "abc", "cab", "cc", "ababab", "abcab", ... }.
As constantes e os operadores acima formam a álgebra de Kleene.
Para evitar parênteses, é assumido que o fecho de Kleene possui a maior prioridade, depois a concatenação e por fim a alternância. Se não houver ambiguidades, os parênteses podem ser omitidos. Por exemplo, (ab)c pode ser escrito como abc, e a|(b(c*)) pode ser escrito como a|bc*.
Exemplos
  • a|b* denota {ε, a, b, bb, bbb, ...}
  • (a|b)* denota o conjunto de todas as cadeias de caracteres que contém os símbols a e b, incluindo a cadeia vazia: {ε, a, b, aa, ab, ba, bb, aaa, ...}
  • ab*(c|ε) denota o conjunto de cadeias de caracteres começando com a, então com zero ou mais bs e opcionalmente com um c: {a, ac, ab, abc, abb, ...}
A definição formal de expressões regulares é concisa e evita a utilização dos quantificadores redundantes ? e +, que podem ser expressados respectivamente por (a|ε) e aa*. Por vezes o operador de complemento ~ é adicionado; ~R denota o conjunto das cadeias de caracteres de Σ* que não estão em R. Esse operador é redundante, e pode ser expressado usando outros operadores, apesar da computação para tal representação ser complexa.
Expressões regulares podem expressar linguagens regulares, a classe de linguagens aceita por um autômato finito. Entretanto, há uma diferença significativa na compactação. Algumas classes de linguagens regulares podem ser descritas somente por autômatos que crescem exponencialmente em tamanho, enquanto o tamanho das expressões regulares requeridas só pode crescer linearmente. Expressões regulares correspondem ao Tipo-3 das gramáticas da Hierarquia de Chomsky. Por outro lado, existe um mapeamento simples de expressões regulares para máquinas de estado finito não-determinísticas que não leva ao crescimento desgovernado do tamanho. Por essa razão, essas máquinas não determinísticas são geralmente usadas como representação alternativa das expressões regulares.
É possível escrever um algoritmo que, para duas expressões regulares dadas, decide se as linguagens descritas são essencialmente iguais. Reduz-se cada expressão na máquina de estado finito mínima, e determina-se se ambas as máquinas mínimas são isomórficas (equivalentes).
Vale notar que diversas implementações de expressões regulares implementam funcionalidades que não podem ser expressadas na álgebra de Kleene; ver abaixo mais sobre o assunto.

Sintaxe

POSIX

De 1986, a norma IEEE POSIX 1003.2 (POSIX.2) padroniza expressões regulares, e fornece duas especificações, a saber: o conjunto básico (BRE) e o conjunto estendido (ERE).

BRE: expressões regulares básicas

A sintaxe tradicional de expressões regulares em Unix seguiu convenções comuns, mas diferiu entre as implementações. A norma IEEE POSIX BRE (Basic Regular Expressions, do inglês, expressões regulares básicas) foi desenvolvida primordialmente por compatibilidade com a sintaxe tradicional, mas fornecia uma norma comum que desde então foi adotada por diversas ferramentas.
Na sintaxe de BRE, a maioria dos caracteres são tratados como literais — eles casam somente com eles próprios (por exemplo, a casa "a"). As exceções são chamadas metacaracteres ou metaseqüências, definidos abaixo:
Metacaractere Descrição
Padrões individuais
. Casa qualquer caractere. Algumas implementações excluem quebra de linha e codificação de caracteres. Nas expressões POSIX de listas de caracteres (ver logo abaixo), o caractere ponto é tratado como o literal. Por exemplo, a.c casa "abc", etc., mas [a.c] casa somente "a", "." ou "c".
[ ] Lista de caracteres. Casa uma ocorrência de qualquer caractere contido na lista. Por exemplo, [abc] casa "a", "b" ou "c". É possível definir intervalos de caracteres: [a-z] casa qualquer caractere de "a" a "z", e [0123456789] é igual a [0-9]. O caractere - é tratado como literal se for o primeiro ou o último da lista, ou se for escapado: [abc-], [-abc] ou [a\-bc].
[^ ] Lista negada de caracteres. Casa uma ocorrência de qualquer caractere não contido na lista. Por exemplo, [^abc] casa qualquer caractere que não seja "a", "b" ou "c". [^a-z] casa qualquer caractere que não esteja em caixa baixa.
Âncoras
^ Casa o começo da cadeia de caracteres. Numa situação de múltiplas linhas, casa o começo das linhas. Logo percebe-se que as âncoras não casam pedaços do texto, elas servem apenas como uma referência.
$ Casa o fim da cadeia de caracteres ou a posição logo antes da quebra de linha do fim da cadeia. Numa situação de múltiplas linhas, casa o fim das linhas.
Captura de dados
BRE: \( \)
ERE: ( )
Grupo de captura. Marca uma subexpressão. A cadeia de caracteres que casa com o conteúdo dentro dos parênteses pode ser chamada posteriormente.
\n Associado com o item anterior. Casa a n-ésima subexpressão marcada, em que n é um dígito de 1 a 9. Essa construção é teoricamente irregular e não foi adotada pela sintaxe POSIX ERE. Algumas ferramentas permitem referenciar mais de nove grupos de captura.
Quantificadores (ou repetidores)
* Casa o elemento precedente zero ou mais vezes. Por exemplo, ab*c casa "ac", "abc", "abbbc", etc.. [xyz]* casa "", "x", "y", "z", "zx", "zyx", "xyzzy", e assim por diante. \(ab\)* casa "", "ab", "abab", "ababab", e assim por diante.
BRE: \{m,n\}
ERE: {m,n}
Casa o elemento precedente pelo menos m vezes e não mais que n vezes. Por exemplo, a\{3,5\} casa somente "aaa", "aaaa", e "aaaaa". Esta funcionalidade não é encontrada em algumas implementações muito antigas. Outras opções incluem omitir um dos campos. Por exemplo, a\{3,\} casa pelo menos três "a"s. Já a\{3\} casa somente três "a"s. b{0,} é análogo a b*, b{0,1} é análogo a b? (ver o quantificador ? abaixo) e b{1,} é idêntico a b+ (ver o quantificador + abaixo).
Uma característica da BRE é que os metacaracteres geralmente exigem barras invertidas para serem tratador como tal. Por exemplo, em BRE, a{1,2} é composto somente por literais, e casará somente "a{1,2}". Para casar entre uma a duas ocorrências de "a", deve-se usar a expressão regular a\{1,2\}. A motivação desse sistema é a compatilidade com sistemas antigos, já que na época da padronização já havia código Unix legado que usava chaves como literais.

ERE: expressões regulares estendidas

O significado dos metacaracteres serem escapados com a barra invertida é revertido na sintaxe POSIX ERE (Extended Regular Expression, do inglês, expressões regulares estendidas). Isso significa que não são usadas barras invertidas para identificar metacaracteres. Pelo contrário, elas servem justamente para transformar metacaracteres em literais. Retomando o exemplo da seção anterior, em ERE, a{1,2} casa uma a duas ocorrências de "a", enquanto a\{1,2\} casa o literal "a{1,2}".
Os seguintes metacaracteres foram adicionados:
Quantificadores
? Casa o elemento precedente zero ou uma vez. Por exemplo, ba? casa "b" ou "ba".
+ Casa o elemento precedente uma ou mais vezes. Por exemplo, ba+ casa "ba", "baa", "baaa", e assim por diante. Como visto na seção de teoria, esse metacaractere pode ser simulado em BRE através de aa*.
Alternadores
| Casa ou a expressão que precede ou a expressão que sucede. Por exemplo, abc|def casa "abc" ou "def".
Ferramentas que adotaram a sintaxe incluem MySQL e PHP, esta, que suporta também as derivações de Perl no modelo do PCRE.

Classes de caracteres

Já que diversos grupos de caracteres dependem duma configuração de locale específica, a POSIX define algumas classes (ou categorias) de caracteres para fornecer um método padrão de acesso a alguns grupos específicos de caracteres bastante utilizados, como mostrado na seguinte tabela:
[:alnum:] Caracteres alfanuméricos, o que no caso de ASCII corresponde a [A-Za-z0-9].
[:alpha:] Caracteres alfabéticos, o que no caso de ASCII corresponde a [A-Za-z].
[:blank:] Espaço e tabulação, o que no caso de ASCII corresponde a [ \t].
[:cntrl:] Caracteres de controle, o que no caso de ASCII corresponde a [\x00-\x1F\x7F].
[:digit:] Dígitos, o que no caso de ASCII corresponde a [0-9]. O Perl oferece o atalho \d.
[:graph:] Caracteres visíveis, o que no caso de ASCII corresponde a [\x21-\x7E].
[:lower:] Caracteres em caixa baixa, o que no caso de ASCII corresponde a [a-z].
[:print:] Caracteres visíveis e espaços, o que no caso de ASCII corresponde a [\x20-\x7E].
[:punct:] Caracteres de pontuação, o que no caso de ASCII corresponde a [-!"#$%&'()*+,./:;<=>?@[\\\]_`{|}~].
[:space:] Caracteres de espaços em branco, o que no caso de ASCII corresponde a [ \t\r\n\v\f]. O Perl oferece o atalho \s, que, entretanto, não é exatamente equivalente; diferente do \s, a classe ainda inclui um tabulador vertical, \x11 do ASCII.4
[:upper:] Caracteres em caixa alta, o que no caso de ASCII corresponde a [A-Z].
[:xdigit:] Dígitos hexadecimais, o que no caso de ASCII corresponde a [A-Fa-f0-9].
Notar que as doze classes definidas acima também estão definidas na biblioteca padrão do C, na seção de funções de testes de caracteres do cabeçalho ctype.h.
Tais classes só podem ser usadas dentro de expressões de listas de caracteres. Diferentes locales podem fornecer classes adicionais. Uma extensão não POSIX difundida é [:word:] (atalho do Perl \w), geralmente definida como [:alnum:] ou traço baixo (_) e [:ascii:], contendo somente caracteres ASCII ([\x01-\x7F]).
Pode-se negar uma classe de caracteres precedendo um acento circunflexo ao nome da classe. Por exemplo, para negar [:digit:] usa-se [:^digit:].

Limites de palavras

A norma POSIX define ainda dois metacaracteres especiais que servem para casar os limites de palavras nas cadeias de caracteres. Nesse contexto da POSIX, uma palavra é formada por caracteres [:alnum:] ou traço baixo (_). Assim como as âncoras, esses metacaracteres não casam pedaços do texto, elas servem apenas como uma referência. Eles são:
[[:<:]] Casa o começo de palavras.
[[:>:]] Casa o fim de palavras.

Perl e derivações

Perl possui uma sintaxe mais consistente e rica que as normas POSIX BRE e ERE. Um exemplo é que \ sempre escapa um caractere não alfanumérico. Devido ao poder de expressão, outras ferramentas adotaram a sintaxe do Perl, como por exemplo Java , JavaScript, PCRE, Python, Ruby e .NET . Algumas linguagens e ferramentas como PHP suportam diversos tipos de expressões regulares.
Um exemplo de funcionalidade possível em Perl mas não em POSIX é a quantificação preguiçosa. Os quantificadores padrões das expressões regulares são "gananciosos", isto é, casam o quanto puderem, voltando atrás somente se necessário para casar o resto da expressão regular. Por exemplo, um novato no assunto tentando encontrar a primeira instância de um item entre os símbolos < e > no texto "Outra explosão ocorreu em <26 de janeiro> de <2004>" provavelmente usaria o padrão <.*>, ou similar. Entretanto, esse padrão retornará "<26 de janeiro> de <2004>" ao invés de "<26 de janeiro>", como esperado, pois o quantificador * é ganancioso — ele consumirá a quantidade máxima de caracteres, e "26 de janeiro> de <2004" possui mais caracteres que "26 de janeiro".
Apesar desse problema ser evitável de diferentes formas (por exemplo, especificando o que não casar: <[^>]*>), a maioria das ferramentas permitem que um quantificador seja preguiçoso, ou não ganancioso, ao suceder o quantificador com um ponto de interrogação. No exemplo anterior, a alternativa seria <.*?>. Seguem os quantificadores não-gulosos:
Quantificadores não-gulosos
?? Versão não-gulosa de ?. Dado o texto "aaa", a? casa "a" enquanto a?? casa "".
*? Versão não-gulosa de *. Dado o texto "aaa", a* casa "aaa" enquanto a*? casa "".
+? Versão não-gulosa de +. Dado o texto "aaa", a+ casa "aaa" enquanto a+? casa "a".
{m,n}? Versão não-gulosa de {m,n}. Dado o texto "aaa", a{2,3} casa "aaa" enquanto a{2,3}? casa "aa".
O PERL define algumas seqüências de escape que servem como atalhos para certos metacaracteres:
Padrões individuais
\s Casa espaços em branco, \n \r ou \t.
\S Negação de \s: casa o que não for espaço em branco, \n \r ou \t.
\w Casa letras, dígitos, ou '_'.
\W Negação de \w
\d Casa dígitos, de 0 a 9.
\D Negação de \d
Âncoras
\b Casa a separação de palavras, o que inclui também o começo (^) e o fim ($) da cadeia de caracteres testada. A definição dos caracteres que formam palavras varia de acordo com a implementação, mas é seguro assumir pelo menos [a-zA-Z0-9_]. Havendo suporte, o atalho \w é uma alternativa válida. O Java é uma notável exceção na medida em que suporta \b mas não \w. Notar que apesar de parecida com os limites de palavras definidos pela POSIX, esta sequência de escape não distingue o começo e o final da palavra, somente a separação em si.
\B Negação de \b
\A Casa o começo da cadeia de caracteres. Numa situação de múltiplas linhas, não casa o começo das linhas seguintes, o que a difere de ^.
\Z Casa o fim da cadeia de caracteres ou a posição logo antes da quebra de linha do fim da cadeia. Numa situação de múltiplas linhas, não casa o fim das linhas seguintes, o que a difere de $.
\z Casa o fim da cadeia de caracteres.
Além dos quantificadores preguiçosos e das novas seqüências de escape, o Perl também adicionou uma forma nova de casamento de padrões que estendem a POSIX. São um conjunto de metacaracteres que seguem o padrão (?…), listados abaixo:
(?# ) Adiciona um comentário, ignorado nos casamentos.
(?: ) Grupo de captura que não é salvo para rechamada posterior (\1, \2, \3, ...)
(?= ) Casa ocorrências do padrão atual a partir da posição atual até o final. Assim como as âncoras (^, $), o padrão não é incluído no casamento, servindo apenas na verificação. Por exemplo, o padrão carro(?=azul) aplicado a "Um carro esportivo azul barato." casará "carro".
(?! ) Negação de (?=), casa a ausência do padrão atual a partir da posição atual até o final, e também não inclui o padrão no casamento. Por exemplo, o padrão carro(?!amarelo) casará em "Um carro esportivo azul barato.", entretanto carro(?!azul) não casará.
(?<= ) Casa ocorrências do padrão atual a partir do começo até a posição atual, mas não inclui o padrão no casamento, servindo apenas na verificação. Por exemplo, o padrão (?<=carro)azul aplicado a "Um carro esportivo azul barato." casará "azul".
(?<! ) Negação de (?<=), casa a ausência do padrão atual a partir do começo até a posição atual, e também não inclui o padrão no casamento. Por exemplo, o padrão (?<!carro)amarelo casará em "Um carro esportivo azul barato.", entretanto (?<!carro)azul não casará.
(? ) Aplica modificadores a partes da expressão regular. Os valores aceitos são i (ignora diferenças entre maiúsculas e minúsculas), m (texto multilinha), s (texto monolinha) e x (inclusão de espaços e comentários).
(?(A)B|C) Um operador ternário, usado geralmente em conjunto dos grupos de captura. Por exemplo, a escolha duma ou outra subexpressão regular depende dum casamento ou não anterior.
(?(A)B) Variação binária da estrutura anterior, em que uma expressão é adicionada ao padrão se e somente se a condição é verdadeira.

Padrões para linguagens não regulares

Diversas funcionalidades encontradas em bibliotecas atuais de expressões regulares provem um poder de expressão que excede as linguagens regulares. Por exemplo, a habilidade de agrupar subexpressões com parênteses e chamar novamente o valor casado na mesma expressão significa que o padrão pode casar cadeias de palavras repetidas como "papa" ou "WikiWiki", os chamados quadrados na teoria de linguagens formais. O padrão para essas cadeias é (.*)\1. Entretanto, a linguagem de quadrados não é regular, nem livre de contexto. Casamento de padrões com um número indeterminado de referências anteriores, como suportado em ferramentas atuais, é NP-difícil.
Entretanto, as ferramentas que fornecem tais construções ainda usam o termo expressões regulares para os padrões, o que leva a uma nomenclatura que difere da teoria das linguagens formais. Por essa razão, algumas pessoas usam o termo regex ou simplesmente padrão para descrever esse conceito mais abrangente.

Implementações

Existem pelo menos dois algoritmos fundamentalmente diferentes entre si que decidem se e como uma expressão regular casa uma cadeia de caracteres.
O mais antigo e mais rápido faz uso dum princípio da teoria de linguagens formais que permite a todas as máquinas de estado finito não determinísticas serem transformadas em máquinas de estado finito determinísticas. Geralmente chamado de DFA, o algoritmo realiza ou simula tal transformação e então executa a máquina determinística resultante na cadeia de caracteres, um símbolo de cada vez. Esse último processo tem complexidade linear relativa ao tamanho da cadeia de caracteres. Mais precisamente, uma cadeia de caracteres de tamanho n pode ser testada numa expressão regular de tamanho m no tempo O(n+2^m) ou O(nm), dependendo dos detalhes de implementação. Esse algoritmo é rápido, mas pode ser usado somente para casamentos e não para a rechamada de grupos de captura, quantificação preguiçosa e diversas outras funcionalidades encontradas nas bibliotecas modernas de expressões regulares. Também é possível executar a máquina não determinística diretamente, construindo cada estado da máquina determinística quando necessário e então descartando-o no próximo passo. Isso evita a quantidade exponencial de memória necessária para a construção completa da máquina determinística, ainda que garantindo a busca em tempo linear.8
O outro algoritmo é casar o padrão com a cadeia de caracteres através de backtracking. Geralmente chamado de NFA, Seu tempo de execução pode ser exponencial, o que pode acontecer em implementações simples no casamento de expressões como (a|aa)*b, que forçam o algoritmo a considerar um número exponencial de subcasos. Implementações modernas geralmente identificam tais casos, e aceleram e abortam a execução. Apesar dessas implementações com backtracking garantirem tempo exponencial no pior caso, elas fornecem mais flexibilidade e poder de expressão.

Relacionamento com Unicode

Originalmente, as expressões regulares eram usadas com caracteres ASCII, mas várias implementações atuais suportam Unicode. Na maioria dos casos não há diferença entre conjuntos de caracteres, mas algumas questões são relevantes ao suportar Unicode.
Uma delas é a codificação suportada, já que algumas implementações esperam UTF-8, enquanto outras podem esperar UTF-16 ou UTF-32. Outra questão é estender as funcionalidades disponíveis para ASCII no Unicode. Por exemplo, em implementações ASCII, conjuntos de caracteres na forma [x-y] são válidos para quaisquer x e y no intervalo [0x00,0x7F] desde que o código de x seja menor que o código de y. A escolha natural seria permitir o mesmo em Unicode no intervalo de códigos [0,0x10FFFF], o que não é possível pois algumas implementações não permitem que conjuntos de caracteres ultrapassem os blocos de código disponíveis.
Do ponto de vista dos detalhes técnicos do Unicode, também surgem questões. Como a normalização, pois, em Unicode, mais de um código pode representar o mesmo caractere. Por exemplo, o caractere "é" pode ser representado por U+0065 (letra latina "e" minúsculo) combinado com U+0301 (diacrítico "acento agudo"), mas também pode ser representado como U+00E9 (letra latina "e" com diacrítico "acento agudo"). Também há os códigos de controle Unicode, as marcas de ordem de byte e as marcas de direção de texto, que devem ser tratados separadamente.

Uso

Expressões regulares são usadas por diversos editores de texto, utilitários e linguagens de programação para procurar e manipular texto baseado em padrões. Por exemplo, Perl e Tcl possuem suporte a expressões regulares nativamente. Diversos utilitários de distribuições Unix incluem o editor de texto ed, que popularizou o conceito de expressão regular, e o filtro grep.
Outro uso é a validação de formatos de texto (validação de protocolos ou formatos digitais). Por exemplo, ao receber a entrada dum campo de formulário duma aplicação que supõe receber um endereço de email, pode-se usar uma expressão regular para garantir que o que foi recebido de fato é um endereço de email.
Mais um uso é a implementação interna dum sistema de realce de sintaxe, como encontrado em ambientes de desenvolvimento integrado. Expressões regulares podem ser usadas para encontrar palavras reservadas, literais e outros tokens específicos, e para alterar a formatação do texto de acordo com o casamento feito.
Um uso difundido de expressões regulares é a filtragem de informação em bancos de dados de texto. Por exemplo, num arquivo de texto contendo cadastros de pessoas e suas datas de aniversário como a seguir:
1954-10-01 João Alberto
1976-07-25 Maria Eduarda
1966-10-22 Carlos Silva
Pode-se filtrar pessoas que nasceram num determinado ano, mês ou dia. Por exemplo, o uso do padrão ^[0-9]{4}-10-[0-9]{2} (.*)$ identifica o nome das pessoas que nasceram em outubro. Para o cadastro acima seriam retornados dois grupos de captura, \1 contendo "João Alberto" e \2 contendo "Carlos Silva". Explorando o exemplo anterior e o uso de validação de formatos digitais, é possível usar expressões regulares para validar as datas presentes no arquivo de texto de aniversários acima. O padrão (19|20)\d\d([- /.])(0[1-9]|1[012])\2([012][0-9]|3[01]) é usado para validar uma data entre 1900-01-01 e 2099-12-31.9 Atentar que a separação entre ano, mês e dia pode se dar através de hífen, espaço em branco, barra ou ponto. Mas deve-se usar o mesmo símbolo de separação entre ano e mês e entre mês e dia, o que é possível através da rechamada do grupo de captura anterior (o trecho \2 do padrão). Atentar também que o padrão é incompleto na medida em que não diferencia a quantidade de dias em cada mês, o que resulta no casamento duma cadeia de caracteres "2000-02-31", incorreta de acordo com o calendário gregoriano.

Fonte:http://pt.wikipedia.org/wiki/Express%C3%A3o_regular