preg_replace ou str_replace
-
21-09-2019 - |
Pergunta
Eu tenho um texto, algo assim:
Paragraphs of text
(SOME KNOWN TEXT)Unknown Text(SOME OTHER KNOWN TEXT)
Some additional paragraphs of text
O que eu quero é manter o Texto desconhecido, mas livre-se do (ALGUM TEXTO CONHECIDO) e (ALGUM OUTRO TEXTO CONHECIDO).
Acho que preg_replace vai me dar o que quero, mas preciso da expressão regular para substituir isso:
(SOME KNOWN TEXT)Unknown Text(SOME OTHER KNOWN TEXT)
com isso ..
Unknown Text
eu vejo o preg_replace leva 3 parâmetros, o expressão regular, o texto de substituição, e assunto.
Existe uma maneira de passar o valor do texto desconhecido para o parâmetro de texto de substituição, OU, uma maneira de recolocar as partes esquerda e direita (ALGUM TEXTO CONHECIDO) e (ALGUM OUTRO TEXTO CONHECIDO) sem remover o texto desconhecido?Alternativamente, existe um str_replace() solução para isso?
Obrigado
---ATUALIZAR---
A parte (ALGUM OUTRO TEXTO CONHECIDO) pode existir em outros lugares do texto, mas não quero que seja removida, a menos que siga o padrão de (ALGUM TEXTO CONHECIDO)Texto desconhecido(ALGUM OUTRO TEXTO CONHECIDO).Estou pensando que as sugestões iniciais de str_replace não funcionariam por causa disso.
Solução
Quais são as condições?Se você tem:
(ALGUM OUTRO TEXTO CONHECIDO)Texto desconhecido(ALGUM TEXTO CONHECIDO)
(ou seja,se o texto entre colchetes for trocado), você ainda deseja removê-lo?O texto conhecido deve estar sempre no início ou no final da linha?Se a resposta for sim para qualquer uma dessas perguntas, provavelmente será melhor usar um regex.Algo assim:
$new_text = preg_replace('/^\(SOME KNOWN TEXT\)(.+)\(SOME OTHER KNOWN TEXT\)$/m, '$1', $text);
As barras invertidas (\
) são para escapar do (
e )
caracteres, que têm um significado especial em expressões regulares.Presumo que você queira alterar o conteúdo - você pode removê-los nesse momento.
Nesta regex, o .
é um operador especial que significa "qualquer personagem". Ele corresponderá a qualquer personagem.O +
significa "um ou mais" e é um modificador do operador anterior - juntos, podem ser interpretados como correspondendo a "um ou mais de qualquer caractere".O (
e )
caracteres são usados para capturar seções do texto em um subpadrão.Ao abranger o .+
entre parênteses, capturamos isso para ser usado na substituição.A primeira seção cercada por (
e )
são rotulados $1
pelo mecanismo regex.Se tivéssemos mais, eles seriam rotulados $2
, $3
, e assim por diante.
Se nenhum destes se aplicar, você pode usar o str_replace
funcionam conforme mencionado nas outras respostas.
Outras dicas
Você pode simplesmente fornecer ao STR_Place uma matriz das cordas que deseja remover como tal:
$destString = str_replace(array('TEXT A', 'TEXT B'), '', $sourceString);
Se você não precisar de qualquer correspondência de padrão inteligente, essa será uma solução mais rápida que o Regex.
Se os dois textos realmente forem conhecidos, você pode fazer isso:
$result = str_replace(array('(SOME KNOWN TEXT)', '(SOME OTHER KNOWN TEXT)'), '', '(SOME KNOWN TEXT)Unknown Text(SOME OTHER KNOWN TEXT)');
o que é melhor desempenho do que uma expressão regular. O primeiro argumento é o conjunto de chaves a serem substituídas, o segundo argumento é com o que substituí -lo e o terceiro é o sujeito.