remover tas html e depois restaurá-las [RESOLVIDO]

1. remover tas html e depois restaurá-las [RESOLVIDO]

shoujo
shoujo

(usa Slackware)

Enviado em 18/06/2017 - 13:43h

Olá, não sei se é possivel, mas vou explicar o cenário..
Estou tentando construir um tradutor de páginas, tipo o que o google faz..
Preciso de capturar o texto de um site, substituir apenas o texto, as tags nao podem ser traduzidas ok?
Mas já tentei varias formas e nenhuma deu certo...
Será que tem como em php ou javascript?
No php sei que da pra remover as tags facilmente com strip tags, mas e depois como faço pra reinserir as tags de volta na variável?
Se alguém souber me ajudar pf.

vamos supor
<div>alguma coisa</div>

Vai ter dezenas, centenas de tag, tag dentro de tag e tudo dinamica, ja que vem dos sites prontos.

ai removo as tags com php... vai ficar so o texto, vamos supor que substituo alguma coisa por katakana -> &#12450;&#12454;&#12464;&#12510;&#12467;&#12452;&#12469;
Quero que volte a ser assim
<div>&#12450;&#12454;&#12464;&#12510;&#12467;&#12452;&#12469;</div>
Ai que tá o problema, como é que o negocio vai saber a posicao das divs, ou outras tags, onde elas estavam, etc?

PS: o viva o linux nao reconheceu os caracteres e veio codigo ascii, mas ai ta as letras em katakana japones

PS: Se ajudar vou dar mais uma dica do que preciso
Ta vendo essa função do php:
array preg_split ( string $pattern , string $subject [, int $limit [, int $flags ]] )
Pois é, ela divide uma string e esse $pattern pode ser uma expressao regular, assim posso dividir usando regex né?
Então, se eu der split em tudo que é array, ele me retorna um array com os valores distribuidos 0,1,2 etc
O que preciso é que ele inclua o $pattern tb nos arrays, ficando assim: 0- $patter, 1- valor1, 2-$pattern, 3- valor2
Lembrando que o valor do $pattern é alterado a cada vez que ele da split pois é um regex que detecta, eu quero a div correta.


  


2. Re: remover tas html e depois restaurá-las

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 18/06/2017 - 15:33h

shoujo escreveu:

Olá, não sei se é possivel, mas vou explicar o cenário..
Estou tentando construir um tradutor de páginas, tipo o que o google faz..
Preciso de capturar o texto de um site, substituir apenas o texto, as tags nao podem ser traduzidas ok?
Mas já tentei varias formas e nenhuma deu certo...
Será que tem como em php ou javascript?
No php sei que da pra remover as tags facilmente com strip tags, mas e depois como faço pra reinserir as tags de volta na variável?
Se alguém souber me ajudar pf.

vamos supor
<div>alguma coisa</div>

Vai ter dezenas, centenas de tag, tag dentro de tag e tudo dinamica, ja que vem dos sites prontos.

ai removo as tags com php... vai ficar so o texto, vamos supor que substituo alguma coisa por katakana -> &#12450;&#12454;&#12464;&#12510;&#12467;&#12452;&#12469;
Quero que volte a ser assim
<div>&#12450;&#12454;&#12464;&#12510;&#12467;&#12452;&#12469;</div>
Ai que tá o problema, como é que o negocio vai saber a posicao das divs, ou outras tags, onde elas estavam, etc?

PS: o viva o linux nao reconheceu os caracteres e veio codigo ascii, mas ai ta as letras em katakana japones


velho .. a única coisa que me passa pela cabeça é vc fazer a exclusão das tag pelo tradutor ... o que eu tb nem sei se é possível !!!

EDIT: quando digo exclusão é para o tradutor não traduzir ou ignorar o que erstiver dentro de "<>"



------------------------------------------| Linux User #621728 |-----------------------------------------
" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"
------------------------------------------| Linux User #621728 |-----------------------------------------



3. Re: remover tas html e depois restaurá-las [RESOLVIDO]

shoujo
shoujo

(usa Slackware)

Enviado em 18/06/2017 - 17:14h

Mauriciodez escreveu:

shoujo escreveu:

Olá, não sei se é possivel, mas vou explicar o cenário..
Estou tentando construir um tradutor de páginas, tipo o que o google faz..
Preciso de capturar o texto de um site, substituir apenas o texto, as tags nao podem ser traduzidas ok?
Mas já tentei varias formas e nenhuma deu certo...
Será que tem como em php ou javascript?
No php sei que da pra remover as tags facilmente com strip tags, mas e depois como faço pra reinserir as tags de volta na variável?
Se alguém souber me ajudar pf.

vamos supor
<div>alguma coisa</div>

Vai ter dezenas, centenas de tag, tag dentro de tag e tudo dinamica, ja que vem dos sites prontos.

ai removo as tags com php... vai ficar so o texto, vamos supor que substituo alguma coisa por katakana -> &#12450;&#12454;&#12464;&#12510;&#12467;&#12452;&#12469;
Quero que volte a ser assim
<div>&#12450;&#12454;&#12464;&#12510;&#12467;&#12452;&#12469;</div>
Ai que tá o problema, como é que o negocio vai saber a posicao das divs, ou outras tags, onde elas estavam, etc?

PS: o viva o linux nao reconheceu os caracteres e veio codigo ascii, mas ai ta as letras em katakana japones


velho .. a única coisa que me passa pela cabeça é vc fazer a exclusão das tag pelo tradutor ... o que eu tb nem sei se é possível !!!

EDIT: quando digo exclusão é para o tradutor não traduzir ou ignorar o que erstiver dentro de "<>"



------------------------------------------| Linux User #621728 |-----------------------------------------
" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"
------------------------------------------| Linux User #621728 |-----------------------------------------


Olha até posso fazer isso, aliás eu consegui fazer isso antes, mas tem um problema muito sério...
Imagina uma pagina de um site, qual tamanho dela?
Tem centenas, milhares de caracteres, o negocio fica muito pesado, imagina um laço for percorrendo uma pagina com milhares de caracteres só pra encontrar um < e saber onde as tags estão? Fica ultra pesado, e inviavel.


4. Re: remover tas html e depois restaurá-las [RESOLVIDO]

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 18/06/2017 - 18:43h

shoujo escreveu:
Olha até posso fazer isso, aliás eu consegui fazer isso antes, mas tem um problema muito sério...
Imagina uma pagina de um site, qual tamanho dela?
Tem centenas, milhares de caracteres, o negocio fica muito pesado, imagina um laço for percorrendo uma pagina com milhares de caracteres só pra encontrar um < e saber onde as tags estão? Fica ultra pesado, e inviavel.


a idéia não é fazer laço não velho ... a idéia é fazer o tradutor ignorar o conteúdo da tag quando encontrar uma sacou , nessa situação não iria pesar, pelo contrário, iria fazer ficar mais leve pois seria menos "textos" para traduzir !!!



------------------------------------------| Linux User #621728 |-----------------------------------------
" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"
------------------------------------------| Linux User #621728 |-----------------------------------------



5. Re: remover tas html e depois restaurá-las [RESOLVIDO]

shoujo
shoujo

(usa Slackware)

Enviado em 18/06/2017 - 19:42h

Mauriciodez escreveu:

shoujo escreveu:
Olha até posso fazer isso, aliás eu consegui fazer isso antes, mas tem um problema muito sério...
Imagina uma pagina de um site, qual tamanho dela?
Tem centenas, milhares de caracteres, o negocio fica muito pesado, imagina um laço for percorrendo uma pagina com milhares de caracteres só pra encontrar um < e saber onde as tags estão? Fica ultra pesado, e inviavel.


a idéia não é fazer laço não velho ... a idéia é fazer o tradutor ignorar o conteúdo da tag quando encontrar uma sacou , nessa situação não iria pesar, pelo contrário, iria fazer ficar mais leve pois seria menos "textos" para traduzir !!!



------------------------------------------| Linux User #621728 |-----------------------------------------
" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"
------------------------------------------| Linux User #621728 |-----------------------------------------


Mas vc sabe como meu tradutor funciona?
Ele faz um laço no texto, pesquisando letra por letra.
Converte as letras normais em katakana...
Katakana é um alfabeto silábico, ou seja eu preciso detectar as sílabas.
Ele vai fazendo o laço em cada letra
Exemplo, com a funcao que faz o laço

function transforma($str)
{
$nova="";
// laço que percorre o texto letra a letra
for($n=0; $n<strlen(utf8_decode($str)); $n++)
{
$car=mb_substr($str, $n,1, "utf-8"); // pega o caractere na posicao n
$resultado=forma_silaba($car, $str, $n+1); //forma a silaba, o retorno aqui é um array que contem a quantidade de letras extras
//que serão acrescidas no $n do laço, e a silaba obtida
$n+=$resultado[0]; // acrescenta ao $n as letras extras da silaba
$nova.=conversor($resultado[1]); //concatena a nova silaba a variavel
}
return $nova; // retorna o resultado final
}
$html="convertendo essa frase aqui";
$htmlConvertida= transforma($html);


Viu so o laço, ele está no tradutor, é assim que construi o tradutor


6. Re: remover tas html e depois restaurá-las [RESOLVIDO]

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 18/06/2017 - 19:48h

shoujo escreveu:
Viu so o laço, ele está no tradutor, é assim que construi o tradutor


então ... se vc colocar um IF não pesaria em nada

se [ estiver dentro de tags ] ignora, senão [ traduz ] loop ... entendeu o q eu estou querendo dizer ????



------------------------------------------| Linux User #621728 |-----------------------------------------
" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"
------------------------------------------| Linux User #621728 |-----------------------------------------



7. Re: remover tas html e depois restaurá-las

shoujo
shoujo

(usa Slackware)

Enviado em 18/06/2017 - 19:58h

Mauriciodez escreveu:

shoujo escreveu:
Viu so o laço, ele está no tradutor, é assim que construi o tradutor


então ... se vc colocar um IF não pesaria em nada

se [ estiver dentro de tags ] ignora, senão [ traduz ] loop ... entendeu o q eu estou querendo dizer ????



------------------------------------------| Linux User #621728 |-----------------------------------------
" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"
------------------------------------------| Linux User #621728 |-----------------------------------------


Sim eu entendi exatamente o que vc quis dizer... vc que não me entendeu....
O que pesa não é o que é feito dentro do laço for não... O que pesa é o próprio laço em si....
Imagina só o laço fazer milhares de execuções?
Por isso eu pedi ajuda pra diminuir o tamanho do lado dividindo ele em um array de varias partes,,,, separando as tags, dos textos, e colocando elas no mesmo array na ordem, assim eu faria um laço no array, que seria pequeno e não ficaria tao pesado.... entende?
Já leu meu codigo...?



8. Re: remover tas html e depois restaurá-las [RESOLVIDO]

shoujo
shoujo

(usa Slackware)

Enviado em 18/06/2017 - 20:10h

vou dar um exemplo pra vc entender melhor..

Do jeito que to fazendo:

$html="<html><head> aqui vai o cabeçalho do site, style, scripts</head><body>aqui vai tudo varias tags, div, a, de tudo que imaginar</body></html>"; <<-- essa variavel ai recebeu o codigo inteiro do site, é enorme vamos supor uns 60 mil letras.
function transforma($str)
{
$nova="";
for($n=0; $n<strlen(utf8_decode($str)); $n++)
{
$car=mb_substr($str, $n,1, "utf-8");
$resultado=forma_silaba($car, $str, $n+1);
$n+=$resultado[0];
$nova.=conversor($resultado[1]);
}
return $nova;
} // a funcao que faz a conversao

Como pode ver, o laço for vai contar tudo, tags, tudo que tiver dentro do html, isso é o que pesa, pois ele conta letra por letra...
nao tem como ele ignorar tags, pelo menos eu nao sei fazer isso, um for detectar tags?

O que quero é algo que divida $html em um array
tipo $array[0]="<html>";
$array[1]="<body>";
e assim sucessivamente, separando tags e textos... Fazer isso por if como vc falou nao é opcao.... pois teria que ler letra por letra pelo laço for procurando menor que e maior que pra detectar, isso nao é solucao...
Preciso de uma mais leve.


9. Re: remover tas html e depois restaurá-las [RESOLVIDO]

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 18/06/2017 - 20:58h

shoujo escreveu:

e assim sucessivamente, separando tags e textos... Fazer isso por if como vc falou nao é opcao.... pois teria que ler letra por letra pelo laço for procurando menor que e maior que pra detectar, isso nao é solucao...
Preciso de uma mais leve.


então velho ... mais não vejo uma solução "barata" pra isso q vc quer ... só vejo essas mesmo ... acho q não tem como um código "gravar" a posição das tags ... ou vc da um jeito dele ignorar as tag ou faz outro para "destraduzir" as tags depois.
se essa tradução gerasse a mesma quantidade de caracteres vc podia bolar um LOG de posicionamento das tag, depois de traduzido vc teria outro código para voltar as tag para o documento com base nas informações do LOG.

Se por acaso vier na minha cabeça alguma idéia eu te falo !!!

------------------------------------------| Linux User #621728 |-----------------------------------------
" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"
------------------------------------------| Linux User #621728 |-----------------------------------------



10. Re: remover tas html e depois restaurá-las

shoujo
shoujo

(usa Slackware)

Enviado em 19/06/2017 - 02:39h

Consegui uma função com php orientado a objetos, que me passaram, mas estou com alguns problemas:

$html="<html><body><div>valor1<a>outro qualquer</a></div> <a> valor 2</a><div><a> valor3</a>valor4</div>valor5<div>valor6</div></body></html>";
$dom = new DOMDocument();
$dom->loadHTML($html);
$body = $dom->getElementsByTagName("html")->item(0);

function getTextsOfElements(DOMNode $element, array $texts = [])
{
// Verifica se o elemento possui elementos filhos:
if ($element->hasChildNodes()) {
// Sim, então percorre todos os elementos filhos de forma recursiva:
foreach ($element->childNodes as $e) {
// Obtém os textos dos elementos filhos:
$tagNome=$e->tagName;
$tag="<".$tagNome.">";
if($tag=="<>") { $tag="</>"; }
$texts[] = $tag;
$texts = getTextsOfElements($e, $texts);
}
} else {
//print_r($element);
// Não, então verifica se o elemento é um texto:
if ($element->nodeType == 3) {
// Sim, remove os espaços em branco:
$text = trim($element->nodeValue);
// Verifica se o texto não é vazio:
if ($text) {
// Sim, então adiciona o texto à lista:
$texts[] = $text;
}
}
}

// Retorna a lista de textos:
return $texts;
}

$retorno=getTextsOfElements($body);
$ultimaTag=array();
for($n=0;$n<count($retorno); $n++)
{
$item=$retorno[$n];
$proximoItem=$retorno[$n+1];
$itemAnterior=$retorno[$n-1];
if($item=="</>")
{
echo $proximoItem;
echo str_replace("<", "</", $ultimaTag[count($ultimaTag)-1]);
array_pop($ultimaTag);
$n++;
}
else
{
echo $item;
if(mb_substr($item, 0, 1, "utf-8")=="<" && mb_substr($item, (strlen($item)-1), 1, "utf-8")==">")
{
array_push($ultimaTag, $item);
}

}

}
?>

O problema ai tá em que após valor1 ser printado, ele está fechando a div, e não deveria...
Esse é o problema, essa função ai não mostra o nome da div que está sendo fechada, e tive que fazer essa gambiarra ai usando uma pilha pra gravar as ultimas divs abertas, e fechar elas e remover da pilha na hora certa... O problema é que ele ta fechando a div, antes de iniciar o link <a> e pelo visto isso ocorre sempre que abre uma div, e abre outra div dentro da div sem fechar e.e


11. Re: remover tas html e depois restaurá-las [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 19/06/2017 - 04:21h

Pode ser que isto aqui seja o caminho:
http://php.net/manual/pt_BR/book.dom.php

Você cria uma cópia do documento, entra na estrutura, traduz e troca o original pela cópia modificada.

----------------------------------------------------------------------------------------------------------------
Nem direita, nem esquerda. Quando se trata de corrupção o Brasil é ambidestro.
(anônimo)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



12. Re: remover tas html e depois restaurá-las [RESOLVIDO]

shoujo
shoujo

(usa Slackware)

Enviado em 19/06/2017 - 18:03h

listeiro_037 escreveu:

Pode ser que isto aqui seja o caminho:
http://php.net/manual/pt_BR/book.dom.php

Você cria uma cópia do documento, entra na estrutura, traduz e troca o original pela cópia modificada.

----------------------------------------------------------------------------------------------------------------
Nem direita, nem esquerda. Quando se trata de corrupção o Brasil é ambidestro.
(anônimo)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden


Não entendi muito nesse site não, sou pessima pra ler documentações kkkk
Mas graças a seu comentário tive uma boa ideia, que funcionou hehehe
Basta nao salvar mais texts[], basta fazer a conversao direto no texto na variavel do dom, e depois dar echo do html completo usando a funcao save html do dom... :D
Ai o ajax recebe em html, e ai e so capturar o body, e substituir ele dentro do iframe e pronto.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts