Expressões regulares variadas

Mais um post da série sobre expressões regulares. Os outros posts de regex podem ser encontrados aqui, aqui e aqui.

Valida número do ISBN (International Standard Book Number)

ISBNx20(?=.{13}$)d{1,5}([- ])d{1,7}1d{1,6}1(d|X)$
Testar


Valida formato do CNPJ

d{2}.?d{3}.?d{3}/?d{4}-?d{2}
Testar


Limitar o tamanho de uma string em 50 caracteres

^(.|n){0,50}$
Testar

Valida formato de temperaturas Celsius e Fahrenheit

^([+-]?[0-9]+)([CF])$
Testar


Valida nomes de dispositivos no Linux (mude a parte do “eth” para validar outros dispositivos)

^(eth[0-9]$)|(^eth[0-9]:[1-9]$)
Testar

Valida nomes de domínios

^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?.)+[a-zA-Z]{2,6}$
Testar

 

Valida e-mails de TLD’s (Top Level Domains) específicos

^[A-Z0-9._%+-]+@[A-Z0-9.-]+.(?:|com|org|net|gov|[A-Z]{2})$
Testar

 

Localiza tags HTML vazias

<([A-Z][A-Z0-9]*)[^>]*>s*</1>
Testar


Localiza variáveis e valores de arquivos INI

^([^=rn]+)=(.*)
Testar


Encontra linhas duplicadas

^(.*)(r?n1)+$
Testar


Localiza rótulos de discos do Windows. Ex: C:

^([a-z]):
Testar

Expressões regulares para trabalhar com data/hora

Mais um post da série sobre regex (Veja os anteriores aqui: Expressões regulares para trabalhar com HTML e Expressões regulares para trabalhar com números). Reuni algumas expressões regulares úteis para trabalhar com data e hora.

Valida data no formato HH:MM

^([0-1][0-9]|[2][0-3]):([0-5][0-9])$
Testar


Variação da anterior, porém não é necessário o separador

^(20|21|22|23|[0-1]d)[0-5]d$
Testar


Valida horas, com ou sem AM/PM. Os segundos não são obrigatórios

^((([0]?[1-9]|1[0-2])(:|.)[0-5][0-9]((:|.)[0-5][0-9])?( )?(AM|am|aM|Am|PM|pm|pM|Pm))|(([0]?[0-9]|1[0-9]|2[0-3])(:|.)[0-5][0-9]((:|.)[0-5][0-9])?))$
Testar


Valida datas no formato dd/mm/yyyy hh:mm:ss

^((((31/(0?[13578]|1[02]))|((29|30)/(0?[1,3-9]|1[0-2])))/(1[6-9]|[2-9]d)?d{2})|(29/0?2/(((1[6-9]|[2-9]d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))|(0?[1-9]|1d|2[0-8])/((0?[1-9])|(1[0-2]))/((1[6-9]|[2-9]d)?d{2})) (20|21|22|23|[0-1]?d):[0-5]?d:[0-5]?d$
Testar


Valida datas entre 1/1/1900 até 31/12/2099

(^((((0[1-9])|([1-2][0-9])|(3[0-1]))|([1-9]))x2F(((0[1-9])|(1[0-2]))|([1-9]))x2F(([0-9]{2})|(((19)|([2]([0]{1})))([0-9]{2}))))$)
Testar


Valida data e hora ou somente hora ou somente data. Data no formato m/d/y

^(?=d)(?:(?:(?:(?:(?:0?[13578]|1[02])(/|-|.)31)1|(?:(?:0?[1,3-9]|1[0-2])(/|-|.)(?:29|30)2))(?:(?:1[6-9]|[2-9]d)?d{2})|(?:0?2(/|-|.)293(?:(?:(?:1[6-9]|[2-9]d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:(?:0?[1-9])|(?:1[0-2]))(/|-|.)(?:0?[1-9]|1d|2[0-8])4(?:(?:1[6-9]|[2-9]d)?d{2}))($| (?=d)))?(((0?[1-9]|1[012])(:[0-5]d){0,2}( [AP]M))|([01]d|2[0-3])(:[0-5]d){1,2})?$
Testar


Valida dias da semana em inglês, resumidos ou não

^(Sun|Mon|(T(ues|hurs))|Fri)(day|.)?$|Wed(.|nesday)?$|Sat(.|urday)?$|T((ue?)|(hu?r?)).?$
Testar


Valida datas no formato MMM dd, yyyy

^(?:(((Jan(uary)?|Ma(r(ch)?|y)|Jul(y)?|Aug(ust)?|Oct(ober)?|Dec(ember)?) 31)|((Jan(uary)?|Ma(r(ch)?|y)|Apr(il)?|Ju((ly?)|(ne?))|Aug(ust)?|Oct(ober)?|(Sept|Nov|Dec)(ember)?) (0?[1-9]|([12]d)|30))|(Feb(ruary)? (0?[1-9]|1d|2[0-8]|(29(?=, ((1[6-9]|[2-9]d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))))), ((1[6-9]|[2-9]d)d{2}))
Testar


Encontra nomes de meses em inglês

^(?:J(anuary|u(ne|ly))|February|Ma(rch|y)|A(pril|ugust)|(((Sept|Nov|Dec)em)|Octo)ber)$
Testar


Valida datas no formato dd/mm/yyyy

^(((0[1-9]|[12]d|3[01])/(0[13578]|1[02])/(d{2}))|((0[1-9]|[12]d|30)/(0[13456789]|1[012])/(d{2}))|((0[1-9]|1d|2[0-8])/02/(d{2}))|(29/02/((0[48]|[2468][048]|[13579][26])|(00))))$
Testar


Encontra fusos horários

[-+]((0[0-9]|1[0-3]):([03]0|45)|14:00)
Testar


Valida datas no formato mm/dd/yyyy ou mm-dd-yyyy

^(((((((0?[13578])|(1[02]))[.-/]?((0?[1-9])|([12]d)|(3[01])))|(((0?[469])|(11))[.-/]?((0?[1-9])|([12]d)|(30)))|((0?2)[.-/]?((0?[1-9])|(1d)|(2[0-8]))))[.-/]?(((19)|(20))?([d][d]))))|((0?2)[.-/]?(29)[.-/]?(((19)|(20))?(([02468][048])|([13579][26])))))$
Testar


Encontra meses válidos

^((0?[1-9])|(1[0-2]))$
Testar

É isso ai. Abraço e até a próxima!

Expressões regulares para trabalhar com números

Continuando a série sobre expressões regulares iniciada aqui, reuni algumas expressões regulares úteis para trabalhar com números.

Encontra números inteiros, incluindo negativos

^[-+]?d*$
Testar


Encontra números inteiros e de ponto flutuante (float, double), incluindo negativos

^[-+]?d*.?d*$
Testar


Encontra qualquer número real

^[-+]?d+(.d+)?$
Testar


Encontra representações de dinheiro em dólar

^$(d{1,3}(,d{3})*|(d+))(.d{2})?$
Testar


Encontra representações de dinheiro em reais

^R$ ?([1-9]{1}[d]{0,2}(.[d]{3})*(,[d]{0,2})?|[1-9]{1}[d]{0,}(,[d]{0,2})?|0(,[d]{0,2})?|(,[d]{1,2})?)$
Testar


Encontra inteiros positivos

^d+$
Testar


Encontra porcentagens, positivas ou negativas, com 2 casas decimais

^-?[0-9]{0,2}(.[0-9]{1,2})?$|^-?(100)(.[0]{1,2})?$
Testar


Encontra inteiros entre 0 ou 000 até 255

^([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])$
Testar


Encontra inteiros entre 0 ou 000 até 127

^(0?[0-9]?[0-9]|1[0-1][0-9]|12[0-7])$
Testar


Encontra inteiros entre 0 e 999

^([0-9]|[1-9][0-9]|[1-9][0-9][0-9])$
Testar


Encontra inteiros entre 1 e 999

^([1-9]|[1-9][0-9]|[1-9][0-9][0-9])$
Testar


Encontra números de cartão de crédito de 13 até 16 dígitos

b(?:d[ -]*?){13,16}b
Testar

Não deixe de entrar em contato caso tenha alguma dúvida ou sugestões para os próximos posts.

Abraço e até a próxima!

Transformando BBCode em XHTML com PHP e Regex

Atendendo a sugestão do amigo @Eldius, da galera do #soudev do Twitter, criei uma função que converte texto em BBCode para XHTML, usando PHP e Regex. A função não é lá das mais elegantes, mas cumpre o prometido, lembrando que o BBCode deve estar escrito corretamente para que ela funcione.

function bbcode($str){
	$str = preg_replace("@[b](.+?)[/b]@i", "<strong>$1</strong>", $str);
	$str = preg_replace("@[i](.+?)[/i]@i", "<em>$1</em>", $str);
	$str = preg_replace("@[u](.+?)[/u]@i", "<span style="text-decoration:underline">$1</span>", $str);
	$str = preg_replace("@[s](.+?)[/s]@i", "<span style="text-decoration:line-through">$1</span>", $str);
	$str = preg_replace("@[img](.+?)[/img]@i", "<img src="$1" alt="" />", $str);
	$str = preg_replace("@[url](.+?)[/url]@i", "<a href="$1">$1</a>", $str);
	$str = preg_replace("@[url=(.+?)](.+?)[/url]@i", "<a href="$1">$2</a>", $str);
	$str = preg_replace("@[email](.+?)[/email]@i", "<a href="mailto:$1">$1</a>", $str);
	$str = preg_replace("@[email=(.+?)](.+?)[/email]@i", "<a href="mailto:$1">$2</a>", $str);
	$str = preg_replace("@[size=(.+?)](.+?)[/size]@i", "<span style="font-size:$1px">$2</span>", $str);
	$str = preg_replace("@[color=(.+?)](.+?)[/color]@i", "<span style="color:$1">$2</span>", $str);
	$str = preg_replace("@[*(?:s*)]s*([^[]*)@i", "<li>$1</li>", $str);
	$str = preg_replace("@[list(?:s*)]((.|n)*?)[/list(?:s*)]@", "<ul>$1</ul>", $str);
	$str = preg_replace("@[list=1(?:s*)]((.|n)*?)[/list(?:s*)]@", "<ol>$1</ol>", $str);
	$str = preg_replace("@[list=a(?:s*)]((.|n)*?)[/list(?:s*)]@", "<ol style="list-style-type:lower-alpha">$1</ol>", $str);
	$str = preg_replace("@[list=i(?:s*)]((.|n)*?)[/list(?:s*)]@", "<ol style="list-style-type:lower-roman">$1</ol>" ,$str);
	$str = preg_replace("@[list=I(?:s*)]((.|n)*?)[/list(?:s*)]@", "<ol style="list-style-type:upper-roman">$1</ol>" ,$str);
	$str = preg_replace("@[list=A(?:s*)]((.|n)*?)[/list(?:s*)]@", "<ol style="list-style-type:upper-alpha">$1</ol>" ,$str);
	$str = preg_replace("@[quote=(.+?)](.+?)[/quote]@i", "$1 disse: <blockquote>$2</blockquote>", $str);
	$str = preg_replace("@[quote](.+?)[/quote]@i", "Citação: <blockquote>$1</blockquote>", $str);
	$str = str_replace("n", '<br />', $str);
	$str = preg_replace("@[align=(.+?)](.+?)[/align]@i", "<div style="text-align:$1">$2</div>", $str);
	$str = preg_replace("@[center](.+?)[/center]@i", "<div style="text-align:center">$1</div>", $str);
	$str = preg_replace("@1@i", "<pre>$1</pre>", $str);
	$str = str_replace("[br]", "<br />", $str);
	return($str);
}

	$string = '[b]Texto em negrito[/b][br][quote=Jonnas]Isso é BBCode[/quote] [br] [url=http://www.php.net][img]http://static.php.net/www.php.net/images/php.gif[/img][/url]';
	echo bbcode($string);

Essa função engloba os BBCodes mais conhecidos. Segue a lista abaixo:

[b] = Negrito
[i] = Itálico
[u] = Sublinhado
[s] = Texto riscado
[img] = Imagem
[url] = Link
[email] = E-mail
[size] = Tamanho do texto
[color] = Cor do texto
[list=a], [list=1], etc = Listas
[quote] = Citação
[align] = Alinhamento do texto
[center] = Centraliza o texto

</strong> = Código<br />
<strong>[br]</strong> = Quebra de página</p>
<p>Mais informações sobre BBCode podem ser encontradas <a href="http://www.phpbb.com/community/faq.php?mode=bbcode" rel="externo">aqui</a> e <a href="http://pt.wikipedia.org/wiki/BBCode" rel="externo">aqui</a>.</p>
<p>Esse código também pode ser modificado facilmente para ser usado em conjunto com o <a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter" rel="externo">SyntaxHighlighter</a>, um script para colorir o código, tornando a visualização mais amigável. Para isso, basta substituir a linha 25 por esta:</p>
<p></p>
1

Aí é usar de acordo com a nomenclatura do próprio script. Um código em PHP ficaria assim:

$nome = "Jonnas";

Caso você encontre algum bug ou tem alguma sugestão, não deixe de entrar em contato.

Abraço e até a próxima!

Expressões regulares para trabalhar com HTML

Reuni algumas expressões regulares úteis para trabalhar com HTML.

Encontra comentários HTML

<!–[sS]*?–[ tnr]*>
Testar

Captura o atributo href de links

href[s]*=[s]*”[^n"]*”
Testar

Encontra todos os atributos de uma tag. Ex: src, name, value.

(?:[w]*) *= *”(?:(?:(?:(?:(?:\W)*\W)*[^"]*)\W)*[^"]*”)
Testar

Encontra tags <h1> até <h6>

<h([1-6])>([^<]*)</h([1-6])>
Testar

Encontra tags <a> válidas

^<a[^>]*([^"]*)[^>]*>([ 0-9a-zA-Z]+)</a>$
Testar

Encontra todas as URL’s de um texto

(http://|https://)([a-zA-Z0-9]+.[a-zA-Z0-9-]+|[a-zA-Z0-9-]+).[a-zA-Z.]{2,6}(/[a-zA-Z0-9.?=/#%&+-]+|/|)
Testar

Encontra todas as imagens

<[iI][mM][gG][a-zA-Z0-9s=".]*((src)=s*(?:”([^"]*)”|’[^']*’))[a-zA-Z0-9s=".]*/*>(?:</[iI][mM][gG]>)*
Testar

Encontra tudo que está entre as tags especificadas. Mais tags podem ser adicionadas

<(script|style)[^>]*?>(?:.|n)*?</s*1s*>
Testar

Útil para remover tags HTML

<[^>]*>
Testar

Encontra extensões de arquivos

.([A-Za-z0-9]{2,5}($|b?))
Testar

Se alguém tiver sugestões para mais expressões regulares, comente ou entre em contato.

Abraço e até a próxima!

As 7 expressões regulares que devemos conhecer

Hoje vou mostrar algumas expressões regulares que podem ser muito úteis. Pra quem não conhece, recomendo a leitura do Guia de Expressões Regulares Online (http://guia-er.sourceforge.net). Os exemplos estão em PHP, mas podem ser facilmente adaptados para qualquer linguagem que suporte regex.

Números de telefone

$telefone = "(54) 9613-4396";
if (preg_match('/^((?[0-9]{2})?|[-. ]?)[ ][0-9]{4}[-. ]?[0-9]{4}$/', $telefone)) {
	echo "Telefone válido";
}

CEP

$cep = "99150-000";
if (preg_match('/^[0-9]{5,5}([- ]?[0-9]{4})?$/', $cep)) {
	echo "CEP válido";
}

Comentários em várias linhas

$comentario = "/* comentario bla bla bla*/";
if (preg_match('/^[(/*)+.+(*/)]$/', $comentario)) {
	echo "Comentário válido";
}


Datas (padrão brasileiro)

$data = "12/04/1990";
if (preg_match('/^d{1,2}/d{1,2}/d{4}$/', $data)) {
	echo "Data válida";
}


Cores hexadecimais

$cor = "#666666";
if (preg_match('/^#(?:(?:[a-fd]{3}){1,2})$/i', $cor)) {
echo "Cor válida";
}

Endereços IP

$ip = "255.255.255.0";
if (preg_match('^(?:25[0-5]|2[0-4]d|1dd|[1-9]d|d)(?:[.](?:25[0-5]|2[0-4]d|1dd|[1-9]d|d)){3}$', $ip)) {
	echo "IP válido";
}

E-mails

$email = "contato@fonini.net";
if (preg_match('/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/',
$email)) {
	echo "E-mail válido";
}