Manusear strings dentro de um texto.

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Manusear strings dentro de um texto.

Mensagem por Itamar M. Lins Jr. »

Ola!
Como eu faço para ler, cortar e adicionar em um texto, por exemplo:
<!DOCTYPE html>
<html>
<body>

<?prg
? "Primeiro PRG script!"
?>

<?prg ? "Segundo PRG script!" ?>

</body>
</html>
Tenho que ler e aguardar a parte até a tag "<?prg" depois pegar dentro desta tag o código e juntar com o resto.

O texto deve sai assim:
<!DOCTYPE html>
<html>
<body>
Primeiro PRG script!
Segundo PRG script!
</body>
</html>
Lembrando que pode ter n tags "<?prg xxx ?>".
Não se preocupar com a parte que vai remover "<?prg" e "?>"
Parece com a rotina que temos para extrai as tags do XML.

Saber quantas vezes essa tag aparece no texto... e cortando e colando.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Manusear strings dentro de um texto.

Mensagem por JoséQuintas »

Seria mais prático se isso estivesse dentro do tal PRG.

Talvez.... ir pegando um bloco de cada vez.
Acho que mais ou menos isto:

Código: Selecionar todos

nStart := 1
DO WHILE .T.
   nStart := hb_At( "<?prg", cHtml, nStart )
   IF nStart == 0
      EXIT
   ENDIF
   nEnd := hb_At( "?>, cHtml, nStart )
   // sei lá o que vai fazer
  cHtml := Subst( cHtml, 1, nStart - 1 ) + ;
      "sei la o que vai fazer" + ;
     Substr( cHtml, nEnd )
   nStart := hb_At( "?>", cHtml, nStart ) + 2
ENDDO
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
lwinter
Usuário Nível 3
Usuário Nível 3
Mensagens: 123
Registrado em: 07 Mar 2011 12:08
Localização: Campinas - SP

Manusear strings dentro de um texto.

Mensagem por lwinter »

Itamar, nao sei o que esta pretendendo fazer mas se for possivel fazer com JSON seria muito mais facil ate porque o harbour trabalha com o JSON de forma nativa importando e exportanto de hash table para json e vice versa.
no json, voce pode exportar qualquer coisa fazendo um encode base 64 e vice versa. muito mais facil de dar manutencao. e simples de programar. Mas nao sei se esse é o seu caso.
Só uma curiosidade o json vem substituindo devagarzinho o XML. Hoje temos o jsonc que deixa voce fazer comentarios no arquivo.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Manusear strings dentro de um texto.

Mensagem por Itamar M. Lins Jr. »

Ola!
Parece que o pessoal já conseguiu fazer.
Vou ver depois como fizeram.
É para poder executar um condigo dentro de um arquivo .HTML igual PHP/Python faz... O harbour via hb_CompileFromBuff() no mod_harbour.
Esperando o commit para testar.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Manusear strings dentro de um texto.

Mensagem por Itamar M. Lins Jr. »

Ola!
hb_TokenCount() retorna 3, mas só tem 2 "<?prg" no exemplo acima, não sei pq retorna 3.
index.html

Código: Selecionar todos

    <!DOCTYPE html>
    <html>
    <body>

    <?prg
    ? "Primeiro PRG script!"
    ?>

    <?prg ? "Segundo PRG script!" ?>

    </body>
    </html>

Código: Selecionar todos

Function Main
Local cHtml:=hb_memoread('index.html')
? cHtml
? hb_TokenCount(cHtml, "<?prg") //retorna 3 deveria ser 2!
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Manusear strings dentro de um texto.

Mensagem por JoséQuintas »

Itamar M. Lins Jr. escreveu:hb_TokenCount() retorna 3, mas só tem 2 "<?prg" no exemplo acima, não sei pq retorna 3.
Depende de como ele trata.
Apesar de só ter 2 blocos com <?prg, sobre 1 bloco sem isso.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1298
Registrado em: 06 Jul 2004 00:44
Contato:

Manusear strings dentro de um texto.

Mensagem por ANDRIL »

Tenta

Código: Selecionar todos

Function Main
	Local cHtml:=hb_memoread('index.html')
	? cHtml
	? my_TokenCount(cHtml, "<?prg") //retorna 3 deveria ser 2!

Código: Selecionar todos

function my_TokenCount(texto,busca)
LOCAL ret:=0
do while .t.
	p=at(busca,texto)
	if (p>0)
		texto=substr(texto,p+len(busca))
		ret++
	else
	exit
	endif
enddo
return ret
Att.
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1298
Registrado em: 06 Jul 2004 00:44
Contato:

Manusear strings dentro de um texto.

Mensagem por ANDRIL »

As funções hb_TokenCount() e hb_aTokens() quando não encontram o que procuram retornam 1, deve ser um bug.

Código: Selecionar todos

Local cHtml:=hb_memoread('index.html')
        ? cHtml
        ? hb_TokenCount(cHtml, "<?prg")-1 //retorna 2
        cHtml:= ''
        ? hb_TokenCount(cHtml, "<?prg")   //retorna 1  
Ou seja, deveria retornar 0 por que cHtml passou a ser vazia.
Att.
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Responder