Limpar string com Regex












3















Tenho a seguinte array em PHP:



[
"Opcao 01 - Frase aleatória - Menu Superior",
"Opcao 02 - Outra Frase aleatória - Menu Su",
"Opcao 03 - Mais 01 Frase - Menu",
"Opcao 04 - Mais Frase -",
"Opcao 05 - Frase Simples",
]


Preciso limpar ela para ficar assim:



01 - Frase aleatória",
02 - Outra Frase aleatória",
03 - Mais 01 Frase",
04 - Mais Frase",
05 - Frase Simples",


E tenho que fazer isto com regex. Como seria a sequência para este filtro?










compartilhar|melhorar esta pergunta

























  • Já tentou isso sem aspas? "d+s+[-]s+w+s+d+"

    – Park
    2 horas atrás











  • Qual linguagem? você já tem algum contexto de codigo que não tem funcionado?

    – Martins Luan
    2 horas atrás











  • @Park olha eu acabei de tentar e não deu certo. Não traz nada de resposta. Até o w deu certo mas depois ja da erro. Obrigado

    – Joao Nivaldo
    2 horas atrás











  • @MartinsLuan vou usar no PHP.

    – Joao Nivaldo
    2 horas atrás






  • 1





    @hkotsubo feito amigo. Acho que melhorou agora. Obrigado pela dica.

    – Joao Nivaldo
    2 horas atrás
















3















Tenho a seguinte array em PHP:



[
"Opcao 01 - Frase aleatória - Menu Superior",
"Opcao 02 - Outra Frase aleatória - Menu Su",
"Opcao 03 - Mais 01 Frase - Menu",
"Opcao 04 - Mais Frase -",
"Opcao 05 - Frase Simples",
]


Preciso limpar ela para ficar assim:



01 - Frase aleatória",
02 - Outra Frase aleatória",
03 - Mais 01 Frase",
04 - Mais Frase",
05 - Frase Simples",


E tenho que fazer isto com regex. Como seria a sequência para este filtro?










compartilhar|melhorar esta pergunta

























  • Já tentou isso sem aspas? "d+s+[-]s+w+s+d+"

    – Park
    2 horas atrás











  • Qual linguagem? você já tem algum contexto de codigo que não tem funcionado?

    – Martins Luan
    2 horas atrás











  • @Park olha eu acabei de tentar e não deu certo. Não traz nada de resposta. Até o w deu certo mas depois ja da erro. Obrigado

    – Joao Nivaldo
    2 horas atrás











  • @MartinsLuan vou usar no PHP.

    – Joao Nivaldo
    2 horas atrás






  • 1





    @hkotsubo feito amigo. Acho que melhorou agora. Obrigado pela dica.

    – Joao Nivaldo
    2 horas atrás














3












3








3








Tenho a seguinte array em PHP:



[
"Opcao 01 - Frase aleatória - Menu Superior",
"Opcao 02 - Outra Frase aleatória - Menu Su",
"Opcao 03 - Mais 01 Frase - Menu",
"Opcao 04 - Mais Frase -",
"Opcao 05 - Frase Simples",
]


Preciso limpar ela para ficar assim:



01 - Frase aleatória",
02 - Outra Frase aleatória",
03 - Mais 01 Frase",
04 - Mais Frase",
05 - Frase Simples",


E tenho que fazer isto com regex. Como seria a sequência para este filtro?










compartilhar|melhorar esta pergunta
















Tenho a seguinte array em PHP:



[
"Opcao 01 - Frase aleatória - Menu Superior",
"Opcao 02 - Outra Frase aleatória - Menu Su",
"Opcao 03 - Mais 01 Frase - Menu",
"Opcao 04 - Mais Frase -",
"Opcao 05 - Frase Simples",
]


Preciso limpar ela para ficar assim:



01 - Frase aleatória",
02 - Outra Frase aleatória",
03 - Mais 01 Frase",
04 - Mais Frase",
05 - Frase Simples",


E tenho que fazer isto com regex. Como seria a sequência para este filtro?







php regex






compartilhar|melhorar esta pergunta















compartilhar|melhorar esta pergunta













compartilhar|melhorar esta pergunta




compartilhar|melhorar esta pergunta








editada 2 horas atrás









hkotsubo

8.55871844




8.55871844










perguntada 2 horas atrás









Joao NivaldoJoao Nivaldo

701719




701719













  • Já tentou isso sem aspas? "d+s+[-]s+w+s+d+"

    – Park
    2 horas atrás











  • Qual linguagem? você já tem algum contexto de codigo que não tem funcionado?

    – Martins Luan
    2 horas atrás











  • @Park olha eu acabei de tentar e não deu certo. Não traz nada de resposta. Até o w deu certo mas depois ja da erro. Obrigado

    – Joao Nivaldo
    2 horas atrás











  • @MartinsLuan vou usar no PHP.

    – Joao Nivaldo
    2 horas atrás






  • 1





    @hkotsubo feito amigo. Acho que melhorou agora. Obrigado pela dica.

    – Joao Nivaldo
    2 horas atrás



















  • Já tentou isso sem aspas? "d+s+[-]s+w+s+d+"

    – Park
    2 horas atrás











  • Qual linguagem? você já tem algum contexto de codigo que não tem funcionado?

    – Martins Luan
    2 horas atrás











  • @Park olha eu acabei de tentar e não deu certo. Não traz nada de resposta. Até o w deu certo mas depois ja da erro. Obrigado

    – Joao Nivaldo
    2 horas atrás











  • @MartinsLuan vou usar no PHP.

    – Joao Nivaldo
    2 horas atrás






  • 1





    @hkotsubo feito amigo. Acho que melhorou agora. Obrigado pela dica.

    – Joao Nivaldo
    2 horas atrás

















Já tentou isso sem aspas? "d+s+[-]s+w+s+d+"

– Park
2 horas atrás





Já tentou isso sem aspas? "d+s+[-]s+w+s+d+"

– Park
2 horas atrás













Qual linguagem? você já tem algum contexto de codigo que não tem funcionado?

– Martins Luan
2 horas atrás





Qual linguagem? você já tem algum contexto de codigo que não tem funcionado?

– Martins Luan
2 horas atrás













@Park olha eu acabei de tentar e não deu certo. Não traz nada de resposta. Até o w deu certo mas depois ja da erro. Obrigado

– Joao Nivaldo
2 horas atrás





@Park olha eu acabei de tentar e não deu certo. Não traz nada de resposta. Até o w deu certo mas depois ja da erro. Obrigado

– Joao Nivaldo
2 horas atrás













@MartinsLuan vou usar no PHP.

– Joao Nivaldo
2 horas atrás





@MartinsLuan vou usar no PHP.

– Joao Nivaldo
2 horas atrás




1




1





@hkotsubo feito amigo. Acho que melhorou agora. Obrigado pela dica.

– Joao Nivaldo
2 horas atrás





@hkotsubo feito amigo. Acho que melhorou agora. Obrigado pela dica.

– Joao Nivaldo
2 horas atrás










3 Respostas
3






ativas

mais antigas

votos


















0














Você pode tentar o seguinte: Isso vai pegar a string antes do "-" ou simplesmente, a string que não tiver traço no final vai pegar tudo



(d+s+[-]s+.*(?=s+-)|d+s+[-].*)


Funciona perfeitamente no regex101.com






compartilhar|melhorar esta resposta


























  • Cara deu certinho a unica coisa é que ele ta pegando o ultimo espaçõ antes do -. Tem como remover este espaço do final?

    – Joao Nivaldo
    1 hora atrás











  • @Joao Nivaldo Dá sim, atualizei a resposta

    – Park
    1 hora atrás








  • 1





    Deu certinho agora. Muito obrigado.

    – Joao Nivaldo
    1 hora atrás



















2














Você pode usar a função preg_replace para fazer a substituição.



A regex pode ser algo como ^w+ (d+ -[^-]+)( -.*)?$:




  • os marcadores ^ e $ são, respectivamente, o início e fim da string. Isso garante que estou verificando toda a string.

  • o atalho w significa "letras (de A a Z, maiúsculas ou minúsculas), números (de 0 a 9) ou o caractere _"

  • o atalho d significa "qualquer dígito de 0 a 9"

  • o quantificador + significa "uma ou mais ocorrências".


  • [^-] é "qualquer caractere que não seja hífen"


  • .* é "zero ou mais ocorrências de qualquer caractere", e o ? logo depois torna o trecho ( -.*) opcional (ou seja, pode ter um espaço, hífen e "qualquer coisa" no final da string)


Então a regex começa com w+ (uma ou mais ocorrências de letras, números ou _), seguido de espaço, depois um ou mais números (d+), espaço, hífen, vários caracteres que não são hífen (isso garante que só vai pegar até o próximo hífen), seguidos opcionalmente por espaço, hífen e .* (zero ou mais ocorrências de qualquer coisa), e por fim o final da string.



O trecho d+ -[^-]+ está entre parênteses, e isso forma um grupo de captura. Isso quer dizer que o texto que corresponde a este trecho pode ser referenciado posteriormente.



No caso, como é o primeiro par de parênteses, o texto que for capturado estará disponível na variável especial $1, que posso usar no replace:



$textos = array(
"Opcao 01 - Frase aleatória - Menu Superior",
"Opcao 02 - Outra Frase aleatória - Menu Su",
"Opcao 03 - Mais 01 Frase - Menu",
"Opcao 04 - Mais Frase -",
"Opcao 05 - Frase Simples");
foreach($textos as $texto) {
echo preg_replace('/^w+ (d+ -[^-]+)( -.*)?$/', '$1', $texto), PHP_EOL;
}


O resultado é:




01 - Frase aleatória

02 - Outra Frase aleatória

03 - Mais 01 Frase

04 - Mais Frase

05 - Frase Simples






Se quiser, pode passar o array inteiro para preg_replace, que o retorno será outro array com as substituições feitas:



$textos = array(
"Opcao 01 - Frase aleatória - Menu Superior",
"Opcao 02 - Outra Frase aleatória - Menu Su",
"Opcao 03 - Mais 01 Frase - Menu",
"Opcao 04 - Mais Frase -",
"Opcao 05 - Frase Simples");
var_dump(preg_replace('/^w+ (d+ -[^-]+)( -.*)?$/', '$1', $textos));


Saída:



array(5) {
[0]=>
string(21) "01 - Frase aleatória"
[1]=>
string(27) "02 - Outra Frase aleatória"
[2]=>
string(18) "03 - Mais 01 Frase"
[3]=>
string(15) "04 - Mais Frase"
[4]=>
string(18) "05 - Frase Simples"
}




Caracteres acentuados



Na regex acima, w não considera caracteres acentuados, então se a string começar com "Opção", por exemplo, não funcionará. Outro detalhe é que w também considera números e o caractere _. Se quiser somente letras, uma opção é usar as propriedades Unicode (usando a categoria L - que considera todas as letras, inclusive de outros alfabetos, como o japonês, coreano, cirílico, etc), não esquecendo de usar o modificador u (logo depois da segunda / na regex):



// trocar w por p{L} e adicionar a opção "u" na regex, para considerar letras acentuadas 
var_dump(preg_replace('/^p{L}+ (d+ -[^-]+)( -.*)?$/u', '$1', $textos));


Se quiser deixar o w, basta adicionar a opção u (lembrando que o w também considera números e o _):



var_dump(preg_replace('/^w+ (d+ -[^-]+)( -.*)?$/u', '$1', $textos));





compartilhar|melhorar esta resposta

































    0














    Você precisa usar a função chamada str_replace, fiz um exemplo pra você



    <?php    
    function limpar_stringl($string){ // replace para limpar variaveis Opcao 01 - Item 01 - Menu Superior
    $string = str_replace('Opcao','', $string);
    $string = str_replace(' - Menu Superior','', $string);
    return $string;
    }
    echo limpar_stringl("Opcao 01 - Item 01 - Menu Superior");



    1. Sempre que quiser refatorar um novo caractere ou conjunto de caracteres palavras etc você vai precisar adicionar uma nova linha no codigo

    2. Relacionar o item$string = str_replace('caractere ou palavra','', $string);






    compartilhar|melhorar esta resposta
























    • Eu preciso como disse fazer com o REGEX. Obrigado

      – Joao Nivaldo
      2 horas atrás











    Sua resposta






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "526"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: false,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: null,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Desenvolvido por u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    rascunho salvo

    rascunho descartado


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fpt.stackoverflow.com%2fquestions%2f367165%2flimpar-string-com-regex%23new-answer', 'question_page');
    }
    );

    Publicar como convidado















    Required, but never shown

























    3 Respostas
    3






    ativas

    mais antigas

    votos








    3 Respostas
    3






    ativas

    mais antigas

    votos









    ativas

    mais antigas

    votos






    ativas

    mais antigas

    votos









    0














    Você pode tentar o seguinte: Isso vai pegar a string antes do "-" ou simplesmente, a string que não tiver traço no final vai pegar tudo



    (d+s+[-]s+.*(?=s+-)|d+s+[-].*)


    Funciona perfeitamente no regex101.com






    compartilhar|melhorar esta resposta


























    • Cara deu certinho a unica coisa é que ele ta pegando o ultimo espaçõ antes do -. Tem como remover este espaço do final?

      – Joao Nivaldo
      1 hora atrás











    • @Joao Nivaldo Dá sim, atualizei a resposta

      – Park
      1 hora atrás








    • 1





      Deu certinho agora. Muito obrigado.

      – Joao Nivaldo
      1 hora atrás
















    0














    Você pode tentar o seguinte: Isso vai pegar a string antes do "-" ou simplesmente, a string que não tiver traço no final vai pegar tudo



    (d+s+[-]s+.*(?=s+-)|d+s+[-].*)


    Funciona perfeitamente no regex101.com






    compartilhar|melhorar esta resposta


























    • Cara deu certinho a unica coisa é que ele ta pegando o ultimo espaçõ antes do -. Tem como remover este espaço do final?

      – Joao Nivaldo
      1 hora atrás











    • @Joao Nivaldo Dá sim, atualizei a resposta

      – Park
      1 hora atrás








    • 1





      Deu certinho agora. Muito obrigado.

      – Joao Nivaldo
      1 hora atrás














    0












    0








    0







    Você pode tentar o seguinte: Isso vai pegar a string antes do "-" ou simplesmente, a string que não tiver traço no final vai pegar tudo



    (d+s+[-]s+.*(?=s+-)|d+s+[-].*)


    Funciona perfeitamente no regex101.com






    compartilhar|melhorar esta resposta















    Você pode tentar o seguinte: Isso vai pegar a string antes do "-" ou simplesmente, a string que não tiver traço no final vai pegar tudo



    (d+s+[-]s+.*(?=s+-)|d+s+[-].*)


    Funciona perfeitamente no regex101.com







    compartilhar|melhorar esta resposta














    compartilhar|melhorar esta resposta



    compartilhar|melhorar esta resposta








    editada 56 mins atrás

























    respondida 2 horas atrás









    ParkPark

    1057




    1057













    • Cara deu certinho a unica coisa é que ele ta pegando o ultimo espaçõ antes do -. Tem como remover este espaço do final?

      – Joao Nivaldo
      1 hora atrás











    • @Joao Nivaldo Dá sim, atualizei a resposta

      – Park
      1 hora atrás








    • 1





      Deu certinho agora. Muito obrigado.

      – Joao Nivaldo
      1 hora atrás



















    • Cara deu certinho a unica coisa é que ele ta pegando o ultimo espaçõ antes do -. Tem como remover este espaço do final?

      – Joao Nivaldo
      1 hora atrás











    • @Joao Nivaldo Dá sim, atualizei a resposta

      – Park
      1 hora atrás








    • 1





      Deu certinho agora. Muito obrigado.

      – Joao Nivaldo
      1 hora atrás

















    Cara deu certinho a unica coisa é que ele ta pegando o ultimo espaçõ antes do -. Tem como remover este espaço do final?

    – Joao Nivaldo
    1 hora atrás





    Cara deu certinho a unica coisa é que ele ta pegando o ultimo espaçõ antes do -. Tem como remover este espaço do final?

    – Joao Nivaldo
    1 hora atrás













    @Joao Nivaldo Dá sim, atualizei a resposta

    – Park
    1 hora atrás







    @Joao Nivaldo Dá sim, atualizei a resposta

    – Park
    1 hora atrás






    1




    1





    Deu certinho agora. Muito obrigado.

    – Joao Nivaldo
    1 hora atrás





    Deu certinho agora. Muito obrigado.

    – Joao Nivaldo
    1 hora atrás













    2














    Você pode usar a função preg_replace para fazer a substituição.



    A regex pode ser algo como ^w+ (d+ -[^-]+)( -.*)?$:




    • os marcadores ^ e $ são, respectivamente, o início e fim da string. Isso garante que estou verificando toda a string.

    • o atalho w significa "letras (de A a Z, maiúsculas ou minúsculas), números (de 0 a 9) ou o caractere _"

    • o atalho d significa "qualquer dígito de 0 a 9"

    • o quantificador + significa "uma ou mais ocorrências".


    • [^-] é "qualquer caractere que não seja hífen"


    • .* é "zero ou mais ocorrências de qualquer caractere", e o ? logo depois torna o trecho ( -.*) opcional (ou seja, pode ter um espaço, hífen e "qualquer coisa" no final da string)


    Então a regex começa com w+ (uma ou mais ocorrências de letras, números ou _), seguido de espaço, depois um ou mais números (d+), espaço, hífen, vários caracteres que não são hífen (isso garante que só vai pegar até o próximo hífen), seguidos opcionalmente por espaço, hífen e .* (zero ou mais ocorrências de qualquer coisa), e por fim o final da string.



    O trecho d+ -[^-]+ está entre parênteses, e isso forma um grupo de captura. Isso quer dizer que o texto que corresponde a este trecho pode ser referenciado posteriormente.



    No caso, como é o primeiro par de parênteses, o texto que for capturado estará disponível na variável especial $1, que posso usar no replace:



    $textos = array(
    "Opcao 01 - Frase aleatória - Menu Superior",
    "Opcao 02 - Outra Frase aleatória - Menu Su",
    "Opcao 03 - Mais 01 Frase - Menu",
    "Opcao 04 - Mais Frase -",
    "Opcao 05 - Frase Simples");
    foreach($textos as $texto) {
    echo preg_replace('/^w+ (d+ -[^-]+)( -.*)?$/', '$1', $texto), PHP_EOL;
    }


    O resultado é:




    01 - Frase aleatória

    02 - Outra Frase aleatória

    03 - Mais 01 Frase

    04 - Mais Frase

    05 - Frase Simples






    Se quiser, pode passar o array inteiro para preg_replace, que o retorno será outro array com as substituições feitas:



    $textos = array(
    "Opcao 01 - Frase aleatória - Menu Superior",
    "Opcao 02 - Outra Frase aleatória - Menu Su",
    "Opcao 03 - Mais 01 Frase - Menu",
    "Opcao 04 - Mais Frase -",
    "Opcao 05 - Frase Simples");
    var_dump(preg_replace('/^w+ (d+ -[^-]+)( -.*)?$/', '$1', $textos));


    Saída:



    array(5) {
    [0]=>
    string(21) "01 - Frase aleatória"
    [1]=>
    string(27) "02 - Outra Frase aleatória"
    [2]=>
    string(18) "03 - Mais 01 Frase"
    [3]=>
    string(15) "04 - Mais Frase"
    [4]=>
    string(18) "05 - Frase Simples"
    }




    Caracteres acentuados



    Na regex acima, w não considera caracteres acentuados, então se a string começar com "Opção", por exemplo, não funcionará. Outro detalhe é que w também considera números e o caractere _. Se quiser somente letras, uma opção é usar as propriedades Unicode (usando a categoria L - que considera todas as letras, inclusive de outros alfabetos, como o japonês, coreano, cirílico, etc), não esquecendo de usar o modificador u (logo depois da segunda / na regex):



    // trocar w por p{L} e adicionar a opção "u" na regex, para considerar letras acentuadas 
    var_dump(preg_replace('/^p{L}+ (d+ -[^-]+)( -.*)?$/u', '$1', $textos));


    Se quiser deixar o w, basta adicionar a opção u (lembrando que o w também considera números e o _):



    var_dump(preg_replace('/^w+ (d+ -[^-]+)( -.*)?$/u', '$1', $textos));





    compartilhar|melhorar esta resposta






























      2














      Você pode usar a função preg_replace para fazer a substituição.



      A regex pode ser algo como ^w+ (d+ -[^-]+)( -.*)?$:




      • os marcadores ^ e $ são, respectivamente, o início e fim da string. Isso garante que estou verificando toda a string.

      • o atalho w significa "letras (de A a Z, maiúsculas ou minúsculas), números (de 0 a 9) ou o caractere _"

      • o atalho d significa "qualquer dígito de 0 a 9"

      • o quantificador + significa "uma ou mais ocorrências".


      • [^-] é "qualquer caractere que não seja hífen"


      • .* é "zero ou mais ocorrências de qualquer caractere", e o ? logo depois torna o trecho ( -.*) opcional (ou seja, pode ter um espaço, hífen e "qualquer coisa" no final da string)


      Então a regex começa com w+ (uma ou mais ocorrências de letras, números ou _), seguido de espaço, depois um ou mais números (d+), espaço, hífen, vários caracteres que não são hífen (isso garante que só vai pegar até o próximo hífen), seguidos opcionalmente por espaço, hífen e .* (zero ou mais ocorrências de qualquer coisa), e por fim o final da string.



      O trecho d+ -[^-]+ está entre parênteses, e isso forma um grupo de captura. Isso quer dizer que o texto que corresponde a este trecho pode ser referenciado posteriormente.



      No caso, como é o primeiro par de parênteses, o texto que for capturado estará disponível na variável especial $1, que posso usar no replace:



      $textos = array(
      "Opcao 01 - Frase aleatória - Menu Superior",
      "Opcao 02 - Outra Frase aleatória - Menu Su",
      "Opcao 03 - Mais 01 Frase - Menu",
      "Opcao 04 - Mais Frase -",
      "Opcao 05 - Frase Simples");
      foreach($textos as $texto) {
      echo preg_replace('/^w+ (d+ -[^-]+)( -.*)?$/', '$1', $texto), PHP_EOL;
      }


      O resultado é:




      01 - Frase aleatória

      02 - Outra Frase aleatória

      03 - Mais 01 Frase

      04 - Mais Frase

      05 - Frase Simples






      Se quiser, pode passar o array inteiro para preg_replace, que o retorno será outro array com as substituições feitas:



      $textos = array(
      "Opcao 01 - Frase aleatória - Menu Superior",
      "Opcao 02 - Outra Frase aleatória - Menu Su",
      "Opcao 03 - Mais 01 Frase - Menu",
      "Opcao 04 - Mais Frase -",
      "Opcao 05 - Frase Simples");
      var_dump(preg_replace('/^w+ (d+ -[^-]+)( -.*)?$/', '$1', $textos));


      Saída:



      array(5) {
      [0]=>
      string(21) "01 - Frase aleatória"
      [1]=>
      string(27) "02 - Outra Frase aleatória"
      [2]=>
      string(18) "03 - Mais 01 Frase"
      [3]=>
      string(15) "04 - Mais Frase"
      [4]=>
      string(18) "05 - Frase Simples"
      }




      Caracteres acentuados



      Na regex acima, w não considera caracteres acentuados, então se a string começar com "Opção", por exemplo, não funcionará. Outro detalhe é que w também considera números e o caractere _. Se quiser somente letras, uma opção é usar as propriedades Unicode (usando a categoria L - que considera todas as letras, inclusive de outros alfabetos, como o japonês, coreano, cirílico, etc), não esquecendo de usar o modificador u (logo depois da segunda / na regex):



      // trocar w por p{L} e adicionar a opção "u" na regex, para considerar letras acentuadas 
      var_dump(preg_replace('/^p{L}+ (d+ -[^-]+)( -.*)?$/u', '$1', $textos));


      Se quiser deixar o w, basta adicionar a opção u (lembrando que o w também considera números e o _):



      var_dump(preg_replace('/^w+ (d+ -[^-]+)( -.*)?$/u', '$1', $textos));





      compartilhar|melhorar esta resposta




























        2












        2








        2







        Você pode usar a função preg_replace para fazer a substituição.



        A regex pode ser algo como ^w+ (d+ -[^-]+)( -.*)?$:




        • os marcadores ^ e $ são, respectivamente, o início e fim da string. Isso garante que estou verificando toda a string.

        • o atalho w significa "letras (de A a Z, maiúsculas ou minúsculas), números (de 0 a 9) ou o caractere _"

        • o atalho d significa "qualquer dígito de 0 a 9"

        • o quantificador + significa "uma ou mais ocorrências".


        • [^-] é "qualquer caractere que não seja hífen"


        • .* é "zero ou mais ocorrências de qualquer caractere", e o ? logo depois torna o trecho ( -.*) opcional (ou seja, pode ter um espaço, hífen e "qualquer coisa" no final da string)


        Então a regex começa com w+ (uma ou mais ocorrências de letras, números ou _), seguido de espaço, depois um ou mais números (d+), espaço, hífen, vários caracteres que não são hífen (isso garante que só vai pegar até o próximo hífen), seguidos opcionalmente por espaço, hífen e .* (zero ou mais ocorrências de qualquer coisa), e por fim o final da string.



        O trecho d+ -[^-]+ está entre parênteses, e isso forma um grupo de captura. Isso quer dizer que o texto que corresponde a este trecho pode ser referenciado posteriormente.



        No caso, como é o primeiro par de parênteses, o texto que for capturado estará disponível na variável especial $1, que posso usar no replace:



        $textos = array(
        "Opcao 01 - Frase aleatória - Menu Superior",
        "Opcao 02 - Outra Frase aleatória - Menu Su",
        "Opcao 03 - Mais 01 Frase - Menu",
        "Opcao 04 - Mais Frase -",
        "Opcao 05 - Frase Simples");
        foreach($textos as $texto) {
        echo preg_replace('/^w+ (d+ -[^-]+)( -.*)?$/', '$1', $texto), PHP_EOL;
        }


        O resultado é:




        01 - Frase aleatória

        02 - Outra Frase aleatória

        03 - Mais 01 Frase

        04 - Mais Frase

        05 - Frase Simples






        Se quiser, pode passar o array inteiro para preg_replace, que o retorno será outro array com as substituições feitas:



        $textos = array(
        "Opcao 01 - Frase aleatória - Menu Superior",
        "Opcao 02 - Outra Frase aleatória - Menu Su",
        "Opcao 03 - Mais 01 Frase - Menu",
        "Opcao 04 - Mais Frase -",
        "Opcao 05 - Frase Simples");
        var_dump(preg_replace('/^w+ (d+ -[^-]+)( -.*)?$/', '$1', $textos));


        Saída:



        array(5) {
        [0]=>
        string(21) "01 - Frase aleatória"
        [1]=>
        string(27) "02 - Outra Frase aleatória"
        [2]=>
        string(18) "03 - Mais 01 Frase"
        [3]=>
        string(15) "04 - Mais Frase"
        [4]=>
        string(18) "05 - Frase Simples"
        }




        Caracteres acentuados



        Na regex acima, w não considera caracteres acentuados, então se a string começar com "Opção", por exemplo, não funcionará. Outro detalhe é que w também considera números e o caractere _. Se quiser somente letras, uma opção é usar as propriedades Unicode (usando a categoria L - que considera todas as letras, inclusive de outros alfabetos, como o japonês, coreano, cirílico, etc), não esquecendo de usar o modificador u (logo depois da segunda / na regex):



        // trocar w por p{L} e adicionar a opção "u" na regex, para considerar letras acentuadas 
        var_dump(preg_replace('/^p{L}+ (d+ -[^-]+)( -.*)?$/u', '$1', $textos));


        Se quiser deixar o w, basta adicionar a opção u (lembrando que o w também considera números e o _):



        var_dump(preg_replace('/^w+ (d+ -[^-]+)( -.*)?$/u', '$1', $textos));





        compartilhar|melhorar esta resposta















        Você pode usar a função preg_replace para fazer a substituição.



        A regex pode ser algo como ^w+ (d+ -[^-]+)( -.*)?$:




        • os marcadores ^ e $ são, respectivamente, o início e fim da string. Isso garante que estou verificando toda a string.

        • o atalho w significa "letras (de A a Z, maiúsculas ou minúsculas), números (de 0 a 9) ou o caractere _"

        • o atalho d significa "qualquer dígito de 0 a 9"

        • o quantificador + significa "uma ou mais ocorrências".


        • [^-] é "qualquer caractere que não seja hífen"


        • .* é "zero ou mais ocorrências de qualquer caractere", e o ? logo depois torna o trecho ( -.*) opcional (ou seja, pode ter um espaço, hífen e "qualquer coisa" no final da string)


        Então a regex começa com w+ (uma ou mais ocorrências de letras, números ou _), seguido de espaço, depois um ou mais números (d+), espaço, hífen, vários caracteres que não são hífen (isso garante que só vai pegar até o próximo hífen), seguidos opcionalmente por espaço, hífen e .* (zero ou mais ocorrências de qualquer coisa), e por fim o final da string.



        O trecho d+ -[^-]+ está entre parênteses, e isso forma um grupo de captura. Isso quer dizer que o texto que corresponde a este trecho pode ser referenciado posteriormente.



        No caso, como é o primeiro par de parênteses, o texto que for capturado estará disponível na variável especial $1, que posso usar no replace:



        $textos = array(
        "Opcao 01 - Frase aleatória - Menu Superior",
        "Opcao 02 - Outra Frase aleatória - Menu Su",
        "Opcao 03 - Mais 01 Frase - Menu",
        "Opcao 04 - Mais Frase -",
        "Opcao 05 - Frase Simples");
        foreach($textos as $texto) {
        echo preg_replace('/^w+ (d+ -[^-]+)( -.*)?$/', '$1', $texto), PHP_EOL;
        }


        O resultado é:




        01 - Frase aleatória

        02 - Outra Frase aleatória

        03 - Mais 01 Frase

        04 - Mais Frase

        05 - Frase Simples






        Se quiser, pode passar o array inteiro para preg_replace, que o retorno será outro array com as substituições feitas:



        $textos = array(
        "Opcao 01 - Frase aleatória - Menu Superior",
        "Opcao 02 - Outra Frase aleatória - Menu Su",
        "Opcao 03 - Mais 01 Frase - Menu",
        "Opcao 04 - Mais Frase -",
        "Opcao 05 - Frase Simples");
        var_dump(preg_replace('/^w+ (d+ -[^-]+)( -.*)?$/', '$1', $textos));


        Saída:



        array(5) {
        [0]=>
        string(21) "01 - Frase aleatória"
        [1]=>
        string(27) "02 - Outra Frase aleatória"
        [2]=>
        string(18) "03 - Mais 01 Frase"
        [3]=>
        string(15) "04 - Mais Frase"
        [4]=>
        string(18) "05 - Frase Simples"
        }




        Caracteres acentuados



        Na regex acima, w não considera caracteres acentuados, então se a string começar com "Opção", por exemplo, não funcionará. Outro detalhe é que w também considera números e o caractere _. Se quiser somente letras, uma opção é usar as propriedades Unicode (usando a categoria L - que considera todas as letras, inclusive de outros alfabetos, como o japonês, coreano, cirílico, etc), não esquecendo de usar o modificador u (logo depois da segunda / na regex):



        // trocar w por p{L} e adicionar a opção "u" na regex, para considerar letras acentuadas 
        var_dump(preg_replace('/^p{L}+ (d+ -[^-]+)( -.*)?$/u', '$1', $textos));


        Se quiser deixar o w, basta adicionar a opção u (lembrando que o w também considera números e o _):



        var_dump(preg_replace('/^w+ (d+ -[^-]+)( -.*)?$/u', '$1', $textos));






        compartilhar|melhorar esta resposta














        compartilhar|melhorar esta resposta



        compartilhar|melhorar esta resposta








        editada 1 hora atrás

























        respondida 2 horas atrás









        hkotsubohkotsubo

        8.55871844




        8.55871844























            0














            Você precisa usar a função chamada str_replace, fiz um exemplo pra você



            <?php    
            function limpar_stringl($string){ // replace para limpar variaveis Opcao 01 - Item 01 - Menu Superior
            $string = str_replace('Opcao','', $string);
            $string = str_replace(' - Menu Superior','', $string);
            return $string;
            }
            echo limpar_stringl("Opcao 01 - Item 01 - Menu Superior");



            1. Sempre que quiser refatorar um novo caractere ou conjunto de caracteres palavras etc você vai precisar adicionar uma nova linha no codigo

            2. Relacionar o item$string = str_replace('caractere ou palavra','', $string);






            compartilhar|melhorar esta resposta
























            • Eu preciso como disse fazer com o REGEX. Obrigado

              – Joao Nivaldo
              2 horas atrás
















            0














            Você precisa usar a função chamada str_replace, fiz um exemplo pra você



            <?php    
            function limpar_stringl($string){ // replace para limpar variaveis Opcao 01 - Item 01 - Menu Superior
            $string = str_replace('Opcao','', $string);
            $string = str_replace(' - Menu Superior','', $string);
            return $string;
            }
            echo limpar_stringl("Opcao 01 - Item 01 - Menu Superior");



            1. Sempre que quiser refatorar um novo caractere ou conjunto de caracteres palavras etc você vai precisar adicionar uma nova linha no codigo

            2. Relacionar o item$string = str_replace('caractere ou palavra','', $string);






            compartilhar|melhorar esta resposta
























            • Eu preciso como disse fazer com o REGEX. Obrigado

              – Joao Nivaldo
              2 horas atrás














            0












            0








            0







            Você precisa usar a função chamada str_replace, fiz um exemplo pra você



            <?php    
            function limpar_stringl($string){ // replace para limpar variaveis Opcao 01 - Item 01 - Menu Superior
            $string = str_replace('Opcao','', $string);
            $string = str_replace(' - Menu Superior','', $string);
            return $string;
            }
            echo limpar_stringl("Opcao 01 - Item 01 - Menu Superior");



            1. Sempre que quiser refatorar um novo caractere ou conjunto de caracteres palavras etc você vai precisar adicionar uma nova linha no codigo

            2. Relacionar o item$string = str_replace('caractere ou palavra','', $string);






            compartilhar|melhorar esta resposta













            Você precisa usar a função chamada str_replace, fiz um exemplo pra você



            <?php    
            function limpar_stringl($string){ // replace para limpar variaveis Opcao 01 - Item 01 - Menu Superior
            $string = str_replace('Opcao','', $string);
            $string = str_replace(' - Menu Superior','', $string);
            return $string;
            }
            echo limpar_stringl("Opcao 01 - Item 01 - Menu Superior");



            1. Sempre que quiser refatorar um novo caractere ou conjunto de caracteres palavras etc você vai precisar adicionar uma nova linha no codigo

            2. Relacionar o item$string = str_replace('caractere ou palavra','', $string);







            compartilhar|melhorar esta resposta












            compartilhar|melhorar esta resposta



            compartilhar|melhorar esta resposta










            respondida 2 horas atrás









            Martins LuanMartins Luan

            927




            927













            • Eu preciso como disse fazer com o REGEX. Obrigado

              – Joao Nivaldo
              2 horas atrás



















            • Eu preciso como disse fazer com o REGEX. Obrigado

              – Joao Nivaldo
              2 horas atrás

















            Eu preciso como disse fazer com o REGEX. Obrigado

            – Joao Nivaldo
            2 horas atrás





            Eu preciso como disse fazer com o REGEX. Obrigado

            – Joao Nivaldo
            2 horas atrás


















            rascunho salvo

            rascunho descartado




















































            Obrigado por contribuir com o Stack Overflow em Português!


            • Certifique-se de responder à pergunta. Entre em detalhes sobre a sua solução e compartilhe o que você descobriu.

            Mas evite



            • Pedir esclarecimentos ou detalhes sobre outras respostas.

            • Fazer afirmações baseadas apenas na sua opinião; aponte referências ou experiências anteriores.


            Para aprender mais, veja nossas dicas sobre como escrever boas respostas.




            rascunho salvo


            rascunho descartado














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fpt.stackoverflow.com%2fquestions%2f367165%2flimpar-string-com-regex%23new-answer', 'question_page');
            }
            );

            Publicar como convidado















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Costa Masnaga

            Fotorealismo

            Sidney Franklin