Limpar string com Regex
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
|
mostrar mais 1 comentário
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
Já tentou isso sem aspas? "d+s+[-]s+w+s+d+"
– Park
3 horas atrás
Qual linguagem? você já tem algum contexto de codigo que não tem funcionado?
– Martins Luan
3 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
3 horas atrás
@MartinsLuan vou usar no PHP.
– Joao Nivaldo
3 horas atrás
1
@hkotsubo feito amigo. Acho que melhorou agora. Obrigado pela dica.
– Joao Nivaldo
3 horas atrás
|
mostrar mais 1 comentário
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
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
php regex
editada 3 horas atrás
hkotsubo
8.55871844
8.55871844
perguntada 4 horas atrás
Joao NivaldoJoao Nivaldo
701719
701719
Já tentou isso sem aspas? "d+s+[-]s+w+s+d+"
– Park
3 horas atrás
Qual linguagem? você já tem algum contexto de codigo que não tem funcionado?
– Martins Luan
3 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
3 horas atrás
@MartinsLuan vou usar no PHP.
– Joao Nivaldo
3 horas atrás
1
@hkotsubo feito amigo. Acho que melhorou agora. Obrigado pela dica.
– Joao Nivaldo
3 horas atrás
|
mostrar mais 1 comentário
Já tentou isso sem aspas? "d+s+[-]s+w+s+d+"
– Park
3 horas atrás
Qual linguagem? você já tem algum contexto de codigo que não tem funcionado?
– Martins Luan
3 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
3 horas atrás
@MartinsLuan vou usar no PHP.
– Joao Nivaldo
3 horas atrás
1
@hkotsubo feito amigo. Acho que melhorou agora. Obrigado pela dica.
– Joao Nivaldo
3 horas atrás
Já tentou isso sem aspas? "d+s+[-]s+w+s+d+"
– Park
3 horas atrás
Já tentou isso sem aspas? "d+s+[-]s+w+s+d+"
– Park
3 horas atrás
Qual linguagem? você já tem algum contexto de codigo que não tem funcionado?
– Martins Luan
3 horas atrás
Qual linguagem? você já tem algum contexto de codigo que não tem funcionado?
– Martins Luan
3 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
3 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
3 horas atrás
@MartinsLuan vou usar no PHP.
– Joao Nivaldo
3 horas atrás
@MartinsLuan vou usar no PHP.
– Joao Nivaldo
3 horas atrás
1
1
@hkotsubo feito amigo. Acho que melhorou agora. Obrigado pela dica.
– Joao Nivaldo
3 horas atrás
@hkotsubo feito amigo. Acho que melhorou agora. Obrigado pela dica.
– Joao Nivaldo
3 horas atrás
|
mostrar mais 1 comentário
3 Respostas
3
ativas
mais antigas
votos
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
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
2 horas atrás
@Joao Nivaldo Dá sim, atualizei a resposta
– Park
2 horas atrás
1
Deu certinho agora. Muito obrigado.
– Joao Nivaldo
2 horas atrás
comentar |
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));
comentar |
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");
- Sempre que quiser refatorar um novo caractere ou conjunto de caracteres palavras etc você vai precisar adicionar uma nova linha no codigo
- Relacionar o item
$string = str_replace('caractere ou palavra','', $string);
Eu preciso como disse fazer com o REGEX. Obrigado
– Joao Nivaldo
3 horas atrás
comentar |
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
});
}
});
Registre-se ou faça log-in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Registre-se usando o Google
Registre-se usando o Facebook
Registre-se usando Email e Senha
Publicar como convidado
Required, but never shown
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
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
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
2 horas atrás
@Joao Nivaldo Dá sim, atualizei a resposta
– Park
2 horas atrás
1
Deu certinho agora. Muito obrigado.
– Joao Nivaldo
2 horas atrás
comentar |
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
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
2 horas atrás
@Joao Nivaldo Dá sim, atualizei a resposta
– Park
2 horas atrás
1
Deu certinho agora. Muito obrigado.
– Joao Nivaldo
2 horas atrás
comentar |
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
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
editada 2 horas atrás
respondida 3 horas atrás
ParkPark
1158
1158
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
2 horas atrás
@Joao Nivaldo Dá sim, atualizei a resposta
– Park
2 horas atrás
1
Deu certinho agora. Muito obrigado.
– Joao Nivaldo
2 horas atrás
comentar |
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
2 horas atrás
@Joao Nivaldo Dá sim, atualizei a resposta
– Park
2 horas atrás
1
Deu certinho agora. Muito obrigado.
– Joao Nivaldo
2 horas 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
2 horas 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
2 horas atrás
@Joao Nivaldo Dá sim, atualizei a resposta
– Park
2 horas atrás
@Joao Nivaldo Dá sim, atualizei a resposta
– Park
2 horas atrás
1
1
Deu certinho agora. Muito obrigado.
– Joao Nivaldo
2 horas atrás
Deu certinho agora. Muito obrigado.
– Joao Nivaldo
2 horas atrás
comentar |
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));
comentar |
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));
comentar |
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));
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));
editada 2 horas atrás
respondida 3 horas atrás
hkotsubohkotsubo
8.55871844
8.55871844
comentar |
comentar |
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");
- Sempre que quiser refatorar um novo caractere ou conjunto de caracteres palavras etc você vai precisar adicionar uma nova linha no codigo
- Relacionar o item
$string = str_replace('caractere ou palavra','', $string);
Eu preciso como disse fazer com o REGEX. Obrigado
– Joao Nivaldo
3 horas atrás
comentar |
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");
- Sempre que quiser refatorar um novo caractere ou conjunto de caracteres palavras etc você vai precisar adicionar uma nova linha no codigo
- Relacionar o item
$string = str_replace('caractere ou palavra','', $string);
Eu preciso como disse fazer com o REGEX. Obrigado
– Joao Nivaldo
3 horas atrás
comentar |
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");
- Sempre que quiser refatorar um novo caractere ou conjunto de caracteres palavras etc você vai precisar adicionar uma nova linha no codigo
- Relacionar o item
$string = str_replace('caractere ou palavra','', $string);
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");
- Sempre que quiser refatorar um novo caractere ou conjunto de caracteres palavras etc você vai precisar adicionar uma nova linha no codigo
- Relacionar o item
$string = str_replace('caractere ou palavra','', $string);
respondida 3 horas atrás
Martins LuanMartins Luan
927
927
Eu preciso como disse fazer com o REGEX. Obrigado
– Joao Nivaldo
3 horas atrás
comentar |
Eu preciso como disse fazer com o REGEX. Obrigado
– Joao Nivaldo
3 horas atrás
Eu preciso como disse fazer com o REGEX. Obrigado
– Joao Nivaldo
3 horas atrás
Eu preciso como disse fazer com o REGEX. Obrigado
– Joao Nivaldo
3 horas atrás
comentar |
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.
Registre-se ou faça log-in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Registre-se usando o Google
Registre-se usando o Facebook
Registre-se usando Email e Senha
Publicar como convidado
Required, but never shown
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
Registre-se ou faça log-in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Registre-se usando o Google
Registre-se usando o Facebook
Registre-se usando Email e Senha
Publicar como convidado
Required, but never shown
Registre-se ou faça log-in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Registre-se usando o Google
Registre-se usando o Facebook
Registre-se usando Email e Senha
Publicar como convidado
Required, but never shown
Registre-se ou faça log-in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Registre-se usando o Google
Registre-se usando o Facebook
Registre-se usando Email e Senha
Registre-se usando o Google
Registre-se usando o Facebook
Registre-se usando Email e Senha
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
Já tentou isso sem aspas? "d+s+[-]s+w+s+d+"
– Park
3 horas atrás
Qual linguagem? você já tem algum contexto de codigo que não tem funcionado?
– Martins Luan
3 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
3 horas atrás
@MartinsLuan vou usar no PHP.
– Joao Nivaldo
3 horas atrás
1
@hkotsubo feito amigo. Acho que melhorou agora. Obrigado pela dica.
– Joao Nivaldo
3 horas atrás