Ir para conteúdo
Fórum Script Brasil
  • 0

Dúvida Sobre "pos" E Variantes... =/


ZueRa

Pergunta

Pessoal, tenho uma lista de sites, e por exemplo, quero filtrar todos eles até a última "/".

Dessa forma:

www.site.com.br/index.php?p=aaaaaaabbbbbcccc

Ao apertar o botão, ficaria assim:

www.site.com.br

Mas, não sei o que fiz de errado, que tenho um site:

www.site.com.br/index.php?p=aaaaabbbbbcccc

e ao apertar o botão, ele deixa o site assim:

http:/

somente isso =/

Literalmente, ele corta tudo que está depois da PRIMEIRA barra...

eu quero que ele corte tudo que está depois da ÚLTIMA barra, ou da última string etc...

Não sei qual foi meu erro, já tentei mudar quase tudo praticamente....

aí está o código:

procedure TFfiltro.passarrr;
var
  a,i, comeco, fim : Integer;
  www : string;
begin
a := google_api.Form1.mmPesquisa.Lines.Count;
  for i := 0 to a do
  begin
    www := google_api.Form1.mmPesquisa.Lines.Strings[i];
      if POS('http://', www) > 0 then
        begin
          comeco := POS('http://', www);
          fim    := POS(Eddelimiter.Text, www);
          Msites.Lines.Add(Copy(www,comeco,fim));
        end;
  end;
end;

Obs.: esse EDDELIMITER é um TEdit, e nele está inserido o caracter "/". Poderia ser "index.php" ou qualquer coisa que o usuário queira que seja filtrado por último.

Alguém poderia me dar uma ajuda ?

Grato.

Link para o comentário
Compartilhar em outros sites

21 respostass a esta questão

Posts Recomendados

  • 0
e ao apertar o botão, ele deixa o site assim:

http:/

apenas para entender o porquê deste resultado:

comeco := POS('http://', www);
Resulta em 1, que é a posição inicial da sequência 'http://';'>http://';
fim    := POS(Eddelimiter.Text, www);
Resulta em 6, que é a posição inicial do delimintador digitado ('/');
Msites.Lines.Add(Copy(www,comeco,fim));
Resulta na cópia do texto em www, iniciando em 1 e com tamanho 6 ('http:/'); Como sempre deverá existir o texto 'http://' na variável www para você processá-la, então bastaria escrever seu código assim:
if POS('http://', www) > 0 then
begin
  www := Copy(www, 7, length(www));  // copia a partir do último '/'
  fim := POS(Eddelimiter.Text, www);  // 
  Msites.Lines.Add(Copy(www, 1, fim -1));  // copia do início até o caracter antes da ocorrência do delimitador
end;

Observe que, da forma como você colocou, se não existir o delimitador, não será copiado nada, já que o resultado em fim será 0 (tamanho zero a copiar). É isto que você deseja?

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus, funcionou sim...

porém estou com outro problema.... o.O

Quando troco a "/" por "index.php" por exemplo... veja o que ele faz:

site original:

http://plasticbugs.com/index.php?p=241

http://www.realclimate.org/index.php?p=181

http://www.realclimate.org/index.php?p=74

http://blogs.zdnet.com/Ou/index.php?p=43

após a modificação:

plasticbugs.com/i

www.realclimate.org/i

www.realclimate.org/i

blogs.zdnet.com/Ou/i

=/

queria nesse caso que ele delimitasse TUDO que eu digito dentro de um TEdit...

Grato.

Link para o comentário
Compartilhar em outros sites

  • 0

ZueRa, fiz desta forma para testar e está funcionando de acordo - em qualque dos casos. Não entendi por que não funcionou com você.

procedure TForm1.Button1Click(Sender: TObject);
var
  fim :integer;
  www :string;
begin
  www := Edit1.Text;

  www := Copy(www, 8, length(www));  // copia a partir do último '/'
  fim := POS(Edit2.Text, www);  //
  Memo1.Lines.Add(Copy(www, 1, fim -1));  // copia do início até o caracter antes da ocorrência do delimitador
end;

site original:

http://plasticbugs.com/index.php?p=241

http://www.realclimate.org/index.php?p=181

após a modificação:

plasticbugs.com/

www.realclimate.org/

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus, está funcionando.. mas você não entendeu...

o limite, ou seja, a "/" (barra) por exemplo.. o usuário é que decide... ele coloca em um Edit qual o limite que ele quer que os sites sejam filtrados.. porém, o filtro não tá pegando toda a frase....

por exemplo, se o usuário digitar "index.php" o filtro pega somente o primeiro "i", mas, tinha que ser a frase toda....

isso que eu quiz explicar acima

Entende ?

Grato.

Link para o comentário
Compartilhar em outros sites

  • 0

Agora entendí.

Quando inicialmente você deu o exemplo com a '/', você queria que ela fosse excluída do resultado. Isto não é compatível com o que você disse agora.

Se você quer que inclua o delimitador no resultado, então quando ele for a '/', esta também estará inclusa no resultado. Mas se por algum motivo, quando o delimitador for a '/', então você terá que fazer um teste extra.

Para suprir o que você colocou no último post, faça isto:

if POS('http://', www) > 0 then
begin
  www := Copy(www, 7, length(www));  // copia a partir do último '/'
  fim := POS(Eddelimiter.Text, www);  //
  if fim > 0 then     // **** inclua este teste  ***
    fim := fim +Length(Eddelimiter.Text);
  Msites.Lines.Add(Copy(www, 1, fim -1));  // copia do início até o caracter antes da ocorrência do delimitador
end;

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

Como você insere cada site em uma linha (Memo.Lines.Add), então é fácil. utilizando o meu último exemplo, Vamos fazer uma pequena alteração para facilitar (adapte a seu código):

if POS('http://', www) > 0 then
begin
  www := Copy(www, 7, length(www));  // copia a partir do último '/'
  fim := POS(Eddelimiter.Text, www); 
  if fim > 0 then
    fim := fim +Length(Eddelimiter.Text);
  www := Copy(www, 1, fim -1);     // **** inclua isto para facilitar o processo ***
  if (www <> '') and  // **** não inclui nulos  ***
    (Msites.Lines.IndexOf(www) = -1) then  // **** se não for encontrado o site na lista, então adiciona ***
    Msites.Lines.Add(www);  // **** observe que este comando mudou em relação ao outro post
end;

Tenha atenção ás linhas com "// ****" para que suas alterações fiquem corretas.

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus, fiz um checkbox aqui, para o usuário escolher o que ele quer, se filtra os repetidos ou não...

mas o que está errado aqui:

procedure TFfiltro.BtaplicarClick(Sender: TObject);
begin
  if Cbrep.Checked = true then
    begin
      passarrrr;
    end;
    else Cbrep.Checked = false then
  Msites.Text := '';
  passarrr;
  limpardelimiter;
  Btsalvarr.SetFocus;
  end;
end;
e na procedure:
procedure TFfiltro.passarrrr;
var
  a,i, fim : Integer;
  www : string;
  x:string;
begin
a := google_api.Form1.mmPesquisa.Lines.Count;
  for i := 0 to a do
  begin
      www := google_api.Form1.mmPesquisa.Lines.Strings[i];
      if POS('http://', www) > 0 then
      begin
        www := Copy(www, 8, length(www));  // copia a partir do último '/'
        fim := POS(Eddelimiter.Text, www);
      if fim > 0 then
        fim := fim +Length(Eddelimiter.Text);
        www := Copy(www, 1, fim -1);     // **** inclua isto para facilitar o processo ***
      if (www <> '') and  // **** não inclui nulos  ***
        (Msites.Lines.IndexOf(www) = -1) then  // **** se não for encontrado o site na lista, então adiciona ***
        Msites.Lines.Add(www);  // **** observe que este comando mudou em relação ao outro post
    end;
  end;
end;

não entendi o erro.. =/

pode me ajudar ?

Grato.

Link para o comentário
Compartilhar em outros sites

  • 0

ZueRa, primeiro uma dica. Na sentença abaixo, tente pensar da seguinte forma: uma instrução IF tem com condição de teste uma avaliação BOOLEANA - certo?! Então se o conteúdo da variável/propriedade é do tipo boolean não há necessidade de comparar "TRUE = TRUE" ou "FALSE = TRUE", já que se Checked é TRUE ou FALSE isto já basta para o IF.

if Cbrep.Checked = true then

begin

passarrrr;

end;

else Cbrep.Checked = false then

Segundo, se o código está como você postou, não deve estar compilando certo?! observe o ";" antes do ELSE, a falta do IF depois do ELSE;

Para que seu checkbox tenha funcionalidade, utilize-o no momento da inclusão na lista:

  if (www <> '') and
     ((Msites.Lines.IndexOf(www) = -1) or // *** se não for encontrado na lista, então adiciona OU
      Cbrep.Checked) then  // *** se permitir duplicar, então adiciona também
    Msites.Lines.Add(www);

Acredito que você deve descartar a parte do IF que você colocou no BtaplicarClick

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

Então.. isso que estou questionando..

ele não funcionou mesmo assim...

procedure TFfiltro.passarrrr;
var
  a,i, fim : Integer;
  www : string;
  x:string;
begin
a := google_api.Form1.mmPesquisa.Lines.Count;
  for i := 0 to a do
  begin
      www := google_api.Form1.mmPesquisa.Lines.Strings[i];
      if POS('http://', www) > 0 then
      begin
        www := Copy(www, 8, length(www));  // copia a partir do último '/'
        fim := POS(Eddelimiter.Text, www);
      if fim > 0 then
        fim := fim +Length(Eddelimiter.Text);
        www := Copy(www, 1, fim -1);     // **** inclua isto para facilitar o processo ***
        if (www <> '') and
          ((Msites.Lines.IndexOf(www) = -1) or // *** se não for encontrado na lista, então adiciona OU
          Cbrep.Checked) then  // *** se permitir duplicar, então adiciona também
          Msites.Lines.Add(www);
    end;
  end;
end;

está copiando muitos sites de mesma HOST (não de mesma URL)...

Link para o comentário
Compartilhar em outros sites

  • 0

se você definiu que Cbrep.Checked = PERMITIR duplicados então estaria certo, como não está funcionando, provavelmente você definiu Cbrep.Checked = NÃO PERMITIR duplicados, neste caso altere para

...

((Msites.Lines.IndexOf(www) = -1) or // *** se não for encontrado na lista, então adiciona OU

not Cbrep.Checked) then // *** se permitir duplicar, então adiciona também

...

Link para o comentário
Compartilhar em outros sites

  • 0

Acho que não expliquei direito...

veja bem...

quero eliminar os sites que estão repetidos na mesma URL... não na mesma string...

exemplo:

www.bol.com.br/index.php?p=aaaabbbbccccc

www.bol.com.br/index.php?p=aaaabbbbccccc

www.bol.com.br/index.php?p=aaaabbbbccccc

www.bol.com.br/index.php?p=aaaabbbbccccc

esses seriam os repetidos na mesma string...

mas é o mesmo host que está repetindo

www.bol.com.br/index.php

www.bol.com.br/index.php

www.bol.com.br/index.php

após a filtragem está repetindo o "www.xxx.com.br", pegou ?

Está repetindo os hosts propriamente ditos....

Grato.

Link para o comentário
Compartilhar em outros sites

  • 0
após a filtragem está repetindo o "www.xxx.com.br", pegou ?
Cara, agora você deu um "nó nas minhas ideias". Acho que "vai ter que desenhar". :D

Não consegui captar não.

Se você tem:

www.bol.com.br/index.php?p=aaaabbbbccccc

www.bol.com.br/index.php?p=aaaabbbbccccc

www.bol.com.br/index.php?p=aaaabbbbccccc

www.bol.com.br/index.php?p=aaaabbbbccccc

quero eliminar os sites que estão repetidos na mesma URL

Como exatamente deveria ficar o resultado. Acho meu tico & teco vão entrar em parafuso. :blink:

Link para o comentário
Compartilhar em outros sites

  • 0

oAIHEehioaAHIOAOHAIO....

é o seguinte...

ao clicar no botão para filtrar os sites, ele filtra, mas só que repete os hosts...

o código que você propôs lembra ?

procedure TFfiltro.passarrrr;
var
  a,i, fim : Integer;
  www : string;
  x:string;
begin
a := google_api.Form1.mmPesquisa.Lines.Count;
  for i := 0 to a do
  begin
      www := google_api.Form1.mmPesquisa.Lines.Strings[i];
      if POS('http://', www) > 0 then
      begin
        www := Copy(www, 8, length(www));  // copia a partir do último '/'
        fim := POS(Eddelimiter.Text, www);
      if fim > 0 then
        fim := fim +Length(Eddelimiter.Text);
        www := Copy(www, 1, fim -1);     // **** inclua isto para facilitar o processo ***
        if (www <> '') and
          ((Msites.Lines.IndexOf(www) = -1) or // *** se não for encontrado na lista, então adiciona OU
          not Cbrep.Checked) then  // *** se permitir duplicar, então adiciona também
          Msites.Lines.Add(www);
    end;
  end;
end;

ele não deixa repetir os sites com A MESMA URL....

por exemplo:

tenho 3 sites:

"www.bol.com.br.com.br"/index1.php

"www.bol.com.br"/index2.php

"www.bol.com.br"/index3.php

e ao clica no botão para filtrar, eles ficam assim:

"www.bol.com.br"/

"www.bol.com.br"/

"www.bol.com.br"/

entende ?

ele repete a parte que está entre as "" (aspas), ou seja, o host, e não o que está depois dela...

deu para entender agora ? o.O

Grato.

Link para o comentário
Compartilhar em outros sites

  • 0

ZueRa, acho até que entendi um pouco mais, mesmo assim desculpe-me, mas acho que encontrei um limite em minha compreensão. :(

Espero que algum outro colega consiga ajudá-do a passar essa etapa.

[]s

Micheus, mesmo assim, muito obrigado... mas consegui =)

Dei uma olhada aqui no code... e consegui !

Fico lhe devendo essa!

Grato.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,9k
×
×
  • Criar Novo...