Jump to content
elcsat

ajuda em expressao para o preg_replace

Recommended Posts

elcsat

ola, tou com dificuldade em escrever uma expressao regular que me faça o seguinte

!##%%!.user.identificador.identificador1.data.texto -> isto representa cada frase que existe no meu texto

eu quero apagar uma frase no meu texto sabendo o user, o identificador e o identificador 1. este texto pode ter uma so um bloco destes ou muitos blocos por exemplo:

!##%%!.nuno.32.fdsgfds54326gs.2011-03-11.um frase qualquer!##%%!.nuno.32.fdsfdsfsw4rer4345.2011-03-12.um frase qualquer 1!##%%!.tono.33.fds4343frr4345.2011-03-11.um frase qualquer 2....e por ai fora

eu queria apagar uma destas ocorrencias. eu fiz isto, so que detecto a ocorrencia mas tudo o que estiver a frente eu tambem apago.

eu estava a tentar fazer como se tivesse isto no final !##%%!, fazendo concatenaçao a isto mas na realidade nao tem

$a = preg_replace('/!##%%!nuno.32.fdsgfds54326gs\.(.*)!##%%!/','','!##%%!nuno.32.fdsgfds54326gs.2011-03-11.um frase qualquer!##%%!nuno.32.fdsfdsfsw4rer4345.2011-03-12.um frase qualquer 1!##%%!tono.33.fds4343frr4345.2011-03-11.um frase qualquer 2!##%%!',1);

gostaria de saber se alguem me pode ajudar neste problema.

obrigado

Share this post


Link to post
Share on other sites
KTachyon

Na pattern tens (.*) que corresponde a qualquer cadeia de caracteres. Em principio o preg_replace não é lazy, ou seja, se há uma cadeia maior que corresponde à pattern, ele continua (acho eu, não te consigo confirmar, mas, pelo resultado do teu teste é isso que estou a assumir).

Ou seja, ele vai apanhar a cadeia desde o momento em que encontra "!##%%!nuno.32.fdsgfds54326gs." até ao último "!##%%!".

Tens duas hipoteses:

1. Metes só os caracteres que podem existir nesse espaço da string.

2. Pesquisas pela expressão que te permite que a expressão regular seja lazy (que eu não te sei dizer, mas se descobrires, posta).

EDIT: Aparentemente, quando as patterns são comparadas com as strings, começam sempre por avaliar a maior cadeia possível.

Tenta com (.*?) em vez de (.*)


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
elcsat

Tenta com (.*?) em vez de (.*)

ja tentei nao resolveu.

a frase pode conter qualquer caracteres menos aquela combinação seguida que uso como limitador !##%%!

Share this post


Link to post
Share on other sites
KTachyon

Pois, é que o problema é que a expressão avalia sempre até ao final da string. Como encontra o delimitador no final, tudo o resto é aceite como (.*). O que podes fazer é utilizar um split para dividir a string por delimitadores e verificar se o conteúdo corresponde a essa expressão regular.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
brunoais

Em vez de meteres só o problema mete também exemplos para ver se te consigo ajudar


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
elcsat

o exemplo é facil:

echo preg_replace('/!##%%!nuno.32.fdsgfds54326gs\.(.*)!##%%!/','','!##%%!nuno.32.fdsgfds54326gs.2011-03-11.um frase qualquer!##%%!nuno.32.fdsfdsfsw4rer4345.2011-03-12.um frase qualquer 1!##%%!tono.33.fds4343frr4345.2011-03-11.um frase qualquer 2!##%%!',1);

é so adicionar em vez do $a, meter a imprimir o exemplo é mesmo aquele, pode é ter uma frase ou 1000 frases.

Pois, é que o problema é que a expressão avalia sempre até ao final da string. Como encontra o delimitador no final, tudo o resto é aceite como (.*). O que podes fazer é utilizar um split para dividir a string por delimitadores e verificar se o conteúdo corresponde a essa expressão regular.

eu queria fazer isto simplesmente numa linha de código.

porque uma solução seria fazer um explode com aquele limitador !##%%!

correr os elementos todos ate aparecer a ocorrência que pretendo e depois da um break, usando o strstr para encontrar a ocorrência do que procuro ja que eu sei o inicio dela.

depois faço um unset a esse elemento em que encontrei a ocorrência, deixando ele de existir.

de seguida faço um implode metendo este elemento para juntar as frases!##%%!

e conseguir apagar a linha que pretendo e funcionando correctamente.

mas a minha ideia e o que eu pretendia era resolver isto numa linha de código, mas se não conseguir descobrir a solução ate ao final da semana, vou optar por isto mesmo.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.