Entendendo as Expressões Regulares

Expressões Regulares

Entendendo as Expressões Regulares

Prefácio

E o assunto hoje é Expressões Regulares!

Com algumas vasculhadas pela internet podemos encontrar inúmeras definições para expressões regulares, porém, vou ficar com a da Wikipédia de lingua portuguesa.

Uma expressão regular, na Informática, define um padrão a ser usado para procurar ou substituir palavras ou grupos de palavras. É um meio preciso de se fazer buscas de determinadas porções de texto.
Por exemplo, se o conjunto de palavras for {asa, carro, jardim, ovos, terra} e a expressão regular buscar por um padrão rr, obterá as palavras carro e terra.
Existem diferentes formatos para definir-se expressões regulares, porém com algumas noções gerais é possível entender boa parte das expressões.

Fonte: Wikipédia – Expressão Regular

Conceito

As Expressões Regulares (ER, Ereg ou RegEx – para os mais íntimos), então, são um método rápido e simples de manipulação e combinação avançada de strings.

Vamos partir do princípio! Uma expressão regular é essencialmente um padrão. É com base nesse padrão que a expressão em questão será avaliada. Primeiro vamos aprender a sintaxe das expressões para depois aprender como fazê-las funcionar…

Operador ^

Este é o primeiro operador que vamos aprender. O ^ indica que a expressão deve iniciar com a string dada.

^era

Esta sintaxe irá definir que a string dada deverá começar com ‘era’. No caso, “era uma vez” seria uma string concordante. Porém, se você tentar “Ele era triste”, não obterá sucesso.

Operador $

Já que temos o operador para definir o começo, temos que ter um para definir o final também! Com $ nós definimos a string que deverá conincidir com o final.

fim$

Esta sintaxe irá definir que a string dada deverá terminar com ‘fim’. Tentando validar a string “Uma viagem sem fim” obteremos sucesso, o que não acontecerá com a string “O fim está próximo”.

Caracteres em Branco e Caracteres de Escape

Assim como no PHP, em expressões regulares nós temos também que nos utilizar de caracteres de escape, a saber: barra invertida ().

Segue, então, a lista com os caracteres de espaço em branco e alguns caracteres que necessitam de escape.

\t – Caracter de tabulação
\n – Nova linha
\f – Avanço de página
\r – Retorno de carro

\. – Qualquer caractere
\\ – Uma barra invertida literal
\- – Um hífen literal

… e com alguma garimpada pela rede você consegue encontrar uma lista mais completa!

Classes de Caracteres

Classes de caracteres são uma espécie de grupo que contêm todas as ocorrências que deverão (ou não deverão) constar em uma expressão…

Por exemplo… Para permitir apenas letras vogais, usaríamos:

[AaEeIiOoUu]

Então com este código teríamos um padrão que só permitirá que apenas vogais estejam na string dada.

Vamos agora aprender intervalo de caracteres

[a-z] - Qualquer letra minúscula
[A-Z] - Qualquer letra maiúscula
[a-zA-Z] - Qualquer letra maiúscula ou minúscula
[0-9] - Qualquer número
[0-9.-] - Qualquer número, ponto ou sinal de subtração

Bom… Tudo muito legal, muito simples… Mas isto serve apenas para combinação de UM caractere.

^[a-z][0-9]$

Neste caso teríamos uma expressão de apenas dois caracteres em que o primeiro tem necessariamente que ser uma letra minúscula e o segundo ser um número.

Agora vamos aprender outra função para o operador ^! Fora de uma classe de caracteres, ele serve para demonstrar o que deve haver no início, porém dentro, ele serve para mostrar o que não deve ocorrer.

^[^0-9][0-9]$

Aqui nós definimos que a expressão deve começar com um caractere que não seja um número e seja imediatamente seguido por um caractere que será um número!

Classes de Caracteres Pré-definidas

Para evitar chateação, foram criadas as classes de caracteres pré-definidas que já vêm junto com o interpretador de ER que você estiver utilizando (lembrando que estão presentes apenas no método POSIX).

[[:alpha:]] // Qualquer letra (alfabético)
[[:digit:]] // Qualquer número (dígito)
[[:alnum:]] // Qualquer letra ou número (alfanumérico)
[[:space:]] // Qualquer caractere de espaço
[[:upper:]] // Qualquer letra maíuscula
[[:lower:]] // Qualquer letra minúscula
[[:punct:]] // Qualquer caractere de pontuação
[[:xdigit:]] // Qualquer dígito hexadecimal (Equivalente a: [0-9a-fA-F])

Ocorrências Múltiplas

Agora vamos pra parte em que realmente começa a fazer sentido usar-se expressões regulares.

^[[:alpha:]]{3}$ // Qualquer palavra de três letras
^a{4}$ // Só fecha com a expressão 'aaaa'
^a{2,4}$ // Fecha com 'aa', 'aaa' e 'aaaa'
^a{2,}$ // Fecha com 'aa', 'aaa', 'aaaa', 'aaaaa' e assim por diante

Até aqui… Tudo tranquilo? Então vamos em frente!

Há outros modos de representar a repetição de caracteres!

? - Uma ocorrência ou nenhuma (Equivale a {0,1})
* - Nenhuma ocorrência, uma ocorrência, duas ocorrências e por aí vai (Equivale a {0,})
+ - Uma ou mais ocorrências (Equivale a {1,})

Se até aqui foi tudo tranquilo, estamos muito bem! :)

Vamos então para o tópico final de expressões regulares

Alternação e Parênteses

A alternação se baseia no caractere de “pipe”, o famoso |. Ele é bem parecido com o operador lógico OR. Por exemplo…

r|s é equivalente a [rs]

Para caracteres simples é com certeza mais conveniente utilizar as classes. A alternação é basicamente útil para utilizar alternância de palavras.

João|Maria|José

Esta expressão só irá retornar verdadeiro se a string dada for “João” OU “Maria” OU “José”.

Agora vamos aos parênteses. Eles tem uma função muito importante.
Caso você utilize

feliz+

Somente fecharia com:
feliz
felizz
felizzz
felizzzz
...

Porém com os parênteses, temos um jeito mais interessante de interar com palavras repetidas.

(feliz)+

Irá fechar com:
feliz
felizfeliz
felizfelizfeliz
...

Quando utilizados em conjunto, obtemos bastante flexibilidade para nossas expressões regulares.

(fel|g|aprend)iz

Irá fechar com:
feliz
giz
aprendiz

-----------
João|Maria$ - Fecha com 'João' em qualquer parte da string ou com 'Maria' no final
(João|Maria)$ - Fecha tanto com "João" quanto "Maria", porém, no final da string
([ab])([xy]) - Fecha com 'ax', 'ay', 'bx' e 'by'

E fim de papo!

Utilizando expressões regulares no PHP

Agora que já aprendemos essa porrada de regras, temos que saber como aplicá-las! (Lembrando que este é o método POSIX. Caso você vá utilizar ER em outra linguagem, pode ter de fazer algumas adaptações)

ereg() e eregi()

Vou ensinar apenas essas duas… Caso você queira se aprofundar mais, olhe no manual do php no capitulo de expressões regulares! :)

Nota de atualizaçãoessas funções foram consideradas obsoletas a partir do PHP 5.3 e não estão presentes no PHP 7. Em vez disso, você deve utilizar a função preg_match() que usa as expressões regulares do PERL.

int ereg(string padrão, string fonte [, array registro]);

Esta função retorna TRUE se o padrão dado for encontrado na fonte e FALSE caso contrário.

<?php
$email = 'mario@gmail.com';
$padrao = "^(.+)@(.+).(.+)$";
if (ereg($padrao,$mail))
{
   print 'Seu email passou na validacao';
}
else
{
   print 'Seu email nao passou na validacao';
}

O que temos?
A string dada deverá começar com algum caractere qualquer em qualquer quantidade, seguido de uma arroba, seguido de mais qualquer caractere em qualquer quantidade, seguido de um ponto literal, seguido de mais qualquer sequência de caracteres, que deverão então finalizar a string.
A função eregi() se comporta de modo semelhante, porém não diferencia maiúsculas e minúsculas.

Conclusão

O mundo das expressões regulares é muito grande e abrangente. Com certeza não vai ser com essa passada de olho que você vai se tornar um expert em ER, mas serve pra dar uma noção do que elas são e para que servem!

Um grande abraço a todos e fiquem com Deus!
Rafael Jaques

  • 4nd3rs0n (Kuen com b

    Mazááá!!

    Agora vou saber como "usar" as expressões regulares!

  • http://www.blogdoxorna.com Xorna

    Ae Rafa, show de bola esse post, expressões regulares são importantes para quem tem um caminho a seguir pela programação. Assunto inevitável, parabéns pelo post e pelo blog que tá com o layout 100% aqui no Feisty Fawn…

    abraço

  • Tomas

    Dessa vez acho que eu aprendo :D

  • http://www.andersontriacca.com Anderson Triacca

    Car#$%, acho que agora finalmente entendí expressões regulares…

    Flw

  • http://www.infoservtreinamento.com.br Esdras

    Mazaááá….

    Grande Rafa…vou usar sim, no Linux vai ajudar um monte…

    so tem que ler neh…

    hehe

    sucesso pra ti

  • http://felipetonello.com felipe tonello

    Iae Mew..

    Muito bom o artigo, parabéns!!!

    ER é muito importante mesmo, aqui no VIM eu uso toda hora.. quebra um galho muito grande… produtividade ao máximo!!

    Abraços

  • André

    Parabéns cara, apesar de ter pouco conteudo tem muita qualidade

  • http://www.alexandresouza.pro.br/ Alexandre Borges Sou

    Eu estava procurando algo que me explica sobre expressão regular! Você é um anjo da guarda! Valeu cara!

  • .bnj

    <script>alert("Xss");</script>

  • giuñ

    <iframe src="http://www.google.com&quot; width="300" onload=alert("Xss"); >

    • http://www.devteam.com.nu Jefrey

      Opa, cara, não é vulnerável kkkkkkkk

      Pela proximidade dos comentários (1 minuto), parece que você é o autor do de cima também.

      O que é burrice, já que ele não aceitou nem as tags de script, porque aceitaria iframe?

      Mas pela escolha do sistema operacional já se conhece o guri, ou melhor, o kiddie kkkkk

      Quanto ao artigo, está excelente!

      Caiu como uma luva. Valeu!

  • http://www.phpit.com.br Rafael Jaques

    Eu acho que vou deixar aí esses dois comentários acima! :P

  • Ederson Dias

    Parabéns pelo post, mto bom!

  • http://www.portalexpert.net Wesley

    Bem legal esse artigo, pô!

    mesmo eu programando em asp.net, foi bem útil esse artigo, está muito bem explicado! :D

    E esses comentários aí da pessoa tentando colocar um script foi legal.. kkkkkkk

    Abraços,

  • Junior

    Eu queria uma explicação de como definir um número mínimo de números para uma estring,

    Ex A senha deve conter pelo menos 3 números e no mínimo 6 caracteres….

    Valeu

  • Gabriel Antunes

    Rafael,

    muito obrigado pelo artigo, me ajudou muito a desenvolver um problema aqui no trabalho, mas por faltade tempo e preguiça nunca optaava por estudar "expressões regulares", agora parando e analisando, não adianta, mesmo que tendo que quebrar a cabeça um pouquinho muitas vezes é a melhor saída, ainda mais quem trabalha com conteúdo de texto. Valeu mesmo. Só um acertozinho: no exemplo você declarou com a variável $email, depois na hora de jogar dentro da função eregi(); você pôs $mail. Só acerta isso lá. Nada que vai atrapalhar o aprendizado, mas é só um acertozinho a fazer…

    GRande Abraços!!!!!

    Gabriel Antunes.

  • http://www.caiobarbosa.com CAIO

    Primeiro lugar: essa perguntinha ai pra validar esse comentário é ruim.

    Pergunta: qual a cor do círculo na bandeira do japão?

    Eu sou daltônico!!!! Sacanagem!

    Bom… o artigo é nota 10!

    Não sabia fazer um expressão regular com 100% de certeza até ler esse artigo!!

    Parabéns!

  • Marcel

    Show de bola, muito explicativo e direto, me ajudou bastante, obrigado!

    Abraço.

  • http://www.maisfacil.org Nei

    Muito interessante… eu realmente não tinha noção de como funcionavam, embora já tivesse manipulado algumas expressões já criadas por outros programadores…

    Este foi o inicio, vou me aprofundar…

  • http://spamer.com SPAMER

    Vlw ajudo mt tio

  • http://www.listeno.com aneildo

    muito bom o artivo

    vlw

  • http://optgeek.blogspot.com/ Jio

    Hmm… Então quer dizer que no final das contas ER não morde…

    Bom artigo, obrigado.

  • http://www.ti.thiagocolares.com.br Thiago Colares

    Bem legal o artigo, parabéns! Gostaria de colocar um link no meu blog… Estou autorizado? Rs… Um abraço.

  • Ricardo

    Muito bom cara, parabéns eu realmente entendi por aqui mais sobre ER. abs…

  • roger

    thanks

  • Luiz Henrique

    Muito bom o artigo! Parabéns continue escrevendo bons artigos.

    Obrigado!

  • http://www.powertecdesign.com.br Rogério

    Muito legal kra achei massa

  • Fernando Wobeto

    Cara, muito bom, estava pesquisando sobre urls amigaveis no PHP e acabei me deparando com esse ótimo tutorial.

    Meus parabens!!

  • Jefferson Souza

    Ótimo tutorial… mas só lembrando a galera que as funções ereg e as demais da mesma classe foram depreciadas no PHP 5.3 e serão excluidas no PHP6 =[ … ou seja, cuidado quanto ao uso… a solução seria a preg_match…

  • http://jasonpiloti.com Jason

    pois bem, estava eu navegando pelo google em busca de expressões regulares, e seu blog apareceu por primeiro! bacana não? hehe.

    muito bom o post, finalmente comecei a entender o sentido de todos aqueles caracteres.hehehe.

    agora vamos tentar usa-los. grande abraço!

  • Bruno

    Excelente post, sobre expressões regulares sempre tive dificuldades de ententer esse assunto, bem se vê que você teve trabalho de fazer um post que não fosse um CTRL C, CTRL V como a gente encontra por ai. Parabéns!Ajudou muito

  • http://anunciossantafe.com.ar Magnus

    muito bom, valeu

  • Jordão

    Cara, muito bom.

    Finalmente tive uma noção sobre o que são as ER.

    Muito obrigado mesmo.

    Preciso usar isso no meu .htaccess.

    Vlw!

  • http://www.jlneto.com.br JL Almeida Neto

    Parabéns cara, muito bom.

    Finalmente consegui entender… rsrsrsrs

  • Inacio

    Parabéns pelo post!

    Gostaria de saber se tem como identificar se uma string está codificada ou não.

    EX:

    str1 = "teste de ação – %30";

    str2 = "teste%20de%20a%E7%E3o%20-%20%2530";

    Preciso realizar o urlencode nas variaveis, porém não posso realizar esta operação caso a variável já esteja codificada.

  • http://tiagobutzke.wordpress.com/ Tiago Butzke

    Muito bom cara.

    Parabéns pelo artigo.

    Abraços!

  • http://www.brasmid.com.br Paulo Taneda

    Excelente artigo, muito útil.

  • Wagner

    Estada Precisando fazer uma página de indexação, e seu artigo foi muito útil, parabéns!!!

  • http://www.cpix.com.br @DagmarCirino

    Muito bom, tirei algumas dúvidas bem básicas agora aqui no trabalho, que eu tava com dificuldade de fazer =]

    Vlw

    ********************

    ahhh

    "<iframe src="http://www.google.com&quot; width="300" onload=alert("Xss"); >"

    Da só uma olhada no sistema operacional do bixinho.

  • http://jpc.cekurte.com/ João Paulo Ce

    Excelente o artigo, finalmente entendi o que são expressões regulares. Obrigado!

  • http://none Raphael

    Parabéns pelo artigo, está bem claro!

  • Marlon

    Ótima Postagem , me ajudou muito :D

  • Jonas

    Mto show, vlw

  • Flávio Vinici

    Gostei! Beastante direto e explicativo!

  • jacs

    Obrigado!

    Valeu :-)

  • joaquim cleto de sou

    Muito bom e fácil de entender. Poderia acrescentar outros comandos, como por exemplo o retrovisor.

    Um abraço.

  • sammyo freitas

    Muito bom, gostei muito do seu post.

    Tudo muito bem explicado e é suficiente para ter uma noção.

  • http://WWW.L2ALONE.COM.BR ADRYLB

    Muito bom, esclareceu e muito minhas duvidas…

    Na verdade usou de todos os operadores e explicou mesmo o que queria saber…

    Muito obrigado

  • http://www.essaeaideia.com Kilderson Sena

    Muito bom artigo sobre Expressões Regulares, o melhor que vi até agora. Precisei compreender para poder desenvolver uma específica para a emprea onde trabalho e esse artigo me ajudou bastante!

    Parabéns ao auto, continue assim !

  • João

    Cara, muito bom. Me ajudou bastante!

  • http://blog.fernandotholl.net Fernando

    Muito bom o material, bem explicado, ajudou muito minha tarefa aqui na empresa!

    Parabéns pelo Blog, Favoritado

  • Ricardo

    Como já tive essa disciplina na faculdade "Automatos e Maquina de Turing", foi muito facil entender como o php trabalha com ER.. Obrigado!

  • http://www.equipebeta.com Renato

    HUMILHOOOO!!! é mto mais simples do que eu imaginava!! haha
    eu sempre copiei validação de email justamente por nao fazer ideia do que isso se tratava!! haha

    fiz uma função pra pegar qualquer url de uma string e transformar em link tanto para http:// quanto para www. e para emails

    quem quiser ta aee http://pastebin.com/4WL9gKeY

    só enviar por parâmetro a variável da string
    fika assim
    $texto = “Esse texto veio do site <a href="http://www.algumsite.com” target=”_blank”>http://www.algumsite.com e meu email é fulano@algumsite.com“;
    $texto = criaurl($texto);
    echo $texto;

    valeu!! =DD

  • Charles

    Gostei muito do artigo. Parabéns mesmo, me ajudou bastante a finalmente entender o que são, pra que serve e como usá-las. Obrigado!

  • http://zunonteekatipsoi.com/ KatipsoiZunontee

    AÊ, enfim um artigo que ensina tudo sobre expressões regulares com PHP! Obrigado, ajudou muito!

  • Black Team

    eeita nois. que artigo bom!

  • Black Team

    Tava com dúvida quanto aos emails, agora sim!

  • Black Team

    Artigo muito bom amigo, pena tentarem te hackear…

  • Miqueloti

    Muito bom o artigo, parabéns!!!

  • Pingback: [ Dica PHP ] – Como extrair emails de arquivos, strings, textos em PHP | Blog do Gilberto Albino()

  • khaio

    Muito bom seu post.
    Me ajudou muito.

    Mas eu tenho uma duvida quanto ao uso da função ereg().
    O Manual do PHP 5.3 diz que essa função foi deprecated(não sei a tradução disso, acho que é descontinuada), e queria saber se você tem uma outra opção para o uso dessa função ou mais alguém conhece alguma outra possibilidade.

    Abrços

  • http://www.pecasempilhadeira.com.br Peças empilhadeira

    isso é muito complexo para mim ainda mas eu chego lá

  • http://www.edvaldotsi.com Edvaldo Szymonek

    Show de bola cara, muito bem explicado, ajudou bastante.

    Abraço

  • Rafael

    muito obrigado !
    Não estava entendendo nada deste assunto, mas graças a sua explicação tudo ficou mais claro

  • http://frienbank.com Paulo Linhares

    É impressão minha ou o PHP5 não aceita mais os termos d , w e s para números, alfanuméricos e espaço respectivamente ?
    Fiz uns testes aqui com eles e preg_match() não acha !

    Muito bom seu post !

  • http://www.carrosusadosbrasil.com.br Carros Seminovos

    Excelente post! Sabendo usar, o negócio muda messmo…rs

  • Pingback: Formatando CPF no SQL com Expressões Regulares – RegexReplace | Flávio Silveira()

  • http://www.sportplanet.com.br/loja-do-fluminense/camisa-do-fluminense.html Rafael

    Muito bom!

  • http://www.sportplanet.com.br/loja-do-fluminense/camisa-do-fluminense.html Camisa do Fluminense

    Excelente post! Esclareceu um assunto que é sempre tido como complexo.

  • http://www.calendario2013.net Feriados 2013

    Muito bem escrito, gostei! No final dos artigos, seria interessante ter algumas questões sobre o assunto para fixação… mais isso seria so um complemento ao entendimento mesmo, abraços e obrigado

  • http://www.slipmp.com.br Marcos Slipmp

    Bem resumido! Gostei! ^^

  • http://www.operariosdaweb.com.br GLAP

    Ctrl+D
    Depois de ler esse post

  • André

    Olá Pessoal Tudo certinho, será que alguém poderia me dizer como posso fazer as seguintes expressões regulares. Obrigado

    Identificadores
    • caracteres válidos – letras, digitos e os
    caracteres especiais: “@”, “#“ e “_”
    • regras de formação:
    • começa com letra ou com “@”
    • não pode terminar com “@”, “#“ e “_”
    • não possui caracteres especiais consecutivos
    • não possui limite de tamanho
     Palavras reservadas
     casos especiais de identificadores
    • programa, var, caracter, cadeia, procedimento, inicio, fim,
    inteiro, booleano, funcao, se, entao, senao, leia, escreva, ou, e,
    nao, falso, verdadeiro, de, faca, real, vetor, enquanto
    OBS.: Esta relação deverá ser atualizada quando da
    especificação sintática da LSI-13/2

     Constantes numéricas
    • Inteiras e reais sem sinal (com ou sem parte
    exponencial)
    • Parte exponencial composta por: “E” ou “e”, sinal
    opcional (“+” ou “-” ) e pelo menos 1 dígito
    • Tokens distintos para constantes inteiras e reais
    • Constantes inteiras – números sem ponto decimal
    • Constantes reais – números com ponto decimal (no
    início, no fim ou no meio)
    6
     Constantes literais
    • Usar ‘ (caracter aspa) como delimitador
    • Sem limite de tamanho
    • No meio de um string, o caracter ‘ (aspa) deve ser
    representado por duas aspas simples justapostas
    Ex. ‘pato d’’agua’
    • Permitir continuação em outra linha
    • Literal não fechado – erro léxico
    • Literais podem conter quaisquer caracteres (mesmo os
    caracteres inválidos para outros fins)

     Comentários de linha  Começa com “//”
     Termina no final da linha

     Comentários de bloco
    • notação: qualquer sequência de caracteres entre os
    delimitadores /* e */
    • não analisar sequências de caracteres internas
    • sem limite de tamanho
    • comentário não fechado = erro léxico

     Símbolos especiais
    (lista a ser atualizada posteriormente)
    • Token específico para cada símbolo
    • Simples: ; , . > < = ( ) [ ] + – * / :
    • Duplos: := .. <> <= >=

  • thiago

    Parabéns, muito objetivo.

  • dma

    Show de bola velho, finalmente algo que explica mesmo sem enrolação e termos difíceis.
    Parabéns mesmo.

  • Saulo Lago

    Poderia me dar uma ajuda? Preciso realizar uma consulta (O site foi desenvolvido wordpress) onde tenho várias especialidades de saúde. Quando um item estar marcado com duas categorias é registrado da seguinte forma no banco de dados: ["1","19] eu preciso filtrar para que os item marcados no 19 não apareça no 1, pois como ambos estão com o número 1 está tendo esse problema. Será que alguém poderia me ajudar?

    • http://www.phpit.com.br/ Rafael Jaques

      Olá Saulo.
      Creio que no seu problema não seja o caso de utilizar expressões regulares.
      Mostre a consulta que você está realizando no banco.
      Talvez eu consiga te ajudar.

      • Saulo Lago

        Bom dia Rafael. então, poderia ser até com outro método mesmo, tentei alguns mas ainda não consegui. A consulta é feita assim:

        $especialidadesaude = empty($_REQUEST['especialidadesaude']) ? 0 : intval($_REQUEST['especialidadesaude']);
        $url = 't.categoria = 11';
        if ($especialidadesaude != 0) {
        $url.= ' AND t.especialidadesaude REGEXP "^('.$especialidadesaude.')$"';
        }
        $params = array(
        'where' => $url,
        'limit' => 15,
        'orderby' => 't.name ASC'
        );

        Meu maior problema é no banco quando tenho duas categorias e ele grava o registro da maneira citada: ["10", "15"]. Infelizmente uso um plugin do wordpress e não tem como mudar essa forma de gravação. Obrigado pela ajuda.

        • http://www.phpit.com.br/ Rafael Jaques

          Saulo,

          Acho que vai ser mais fácil de resolver teu problema com uma expressão regular mais simples.
          Utilizei uma expressão que captura os números 11 e 2, entre aspas (por isso tem as aspas simples, pra delimitar a string, e as duplas por causa do teu plugin). A alternância de valores é separada por pipe " | ".

          […] WHERE t.especialidadesaude REGEXP '"(11|2)"'

          A tua expressão não deve estar funcionando porque você delimita início e final da string, ou seja, ela teria que ser exatamente o valor que tu procura ao invés de CONTER o valor, como você tá precisando.

          Se os dados que você recebe no PHP são mais de um, em array, você pode juntá-los com implode.

          Depois comenta aí se deu certo.

          • Saulo Lago

            Infelizmente não deu certo =/ ele exibiu todos os resultados. Lembrando que poderá conter o valor 1 sem as aspas e poderá conter como eu citei, caso tenha mais de uma categoria. Pesquisando na internet eu encontrei esse site: http://tools.lymas.com.br/regexp_br.php para poder testar e consegui obter o seguinte resultado (no site de teste):
            No campo expressão digitei: ^(1).*$|"["(12)"]+".*$
            No campo texto 1 digite: 1
            no campo texto 2 digitei: ["10", "12", "13"]
            Peguei a expressão acime e tentei coloca-la no mysql mas ainda ele esta pegando os valor do 19 quando eu coloco somente o número 1, em partes esta funcionand. Poderia dar uma olhada para ver se acha o problema? enquanto isso estou tentando aqui

          • Saulo Lago

            Para que possamos destrinchar melhor. O primeiro resultado é para exibir o número inteiro, então fiz da seguinte maneira:
            ^(1)*$

            A segunda parte é pegar os valores dentro das aspas, tanto na esquerda, centro e direita, então estou testando assim: ^"["(12)"]"+*$ já consegui pegar os valores dentro das aspas tanto na esquerda quanto na direita, mas no centro não pego. Conseguiria ver essa segunda parte? estou testando no site que mencionei.

          • http://www.phpit.com.br/ Rafael Jaques

            Então não sei se entendi direito…

            O valor pode ser um inteiro ou um conjunto de strings, é isso?

          • Saulo Lago

            Então, estou com esse problema nesse abençoad plugin e a forma que ele grava no banco de dados, por gravar tanto assim: "10" (Ignore as aspas) quanto assim ["10", "20", "30"] (para valores múltiplos). Preciso pegar qualquer resultado dentro das aspas, na segunda parte.

          • http://www.phpit.com.br/ Rafael Jaques

            Nesse caso, acho que o problema é um pouco mais simples de ser resolvido, então.

            Tentou algo assim?

            […] WHERE t.especialidadesaude IN (1,6) OR t.especialidadesaude REGEXP '"(1|6)"'

          • Saulo Lago

            Tentei mais ainda não deu certo =/

          • http://www.phpit.com.br/ Rafael Jaques

            Então deve ser um problema na tua consulta…
            Envia ela completa, depois de ser "compilada", como vai ao banco.

          • Saulo Lago

            Depois de quebrar muito a cabeça consegui resolver e pro incrível que parece era algo simples ¬¬. Usei a seguinte expressão: ^(18)*$|"(22)"
            No caso no meu código ficou assim:
            $url.= ' AND t.especialidadesaude REGEXP "^('.$especialidadesaude.')*$|"('.$especialidadesaude.')"" ';

            Na primeira parte verifica se tem o valor intero e na segunda pega os valores que estão dentro das aspas.

          • http://www.phpit.com.br/ Rafael Jaques

            Que bom.
            Fico feliz em saber que funcionou.
            :)