Jump to content


Photo

Php - Find And Replace


  • Faça o login para participar
15 replies to this topic

#1 HdN

HdN

    Turista

  • Usuários
  • 37 posts
  • Sexo:Masculino
  • Localidade:Bauru - SP

Posted 12/01/2008, 02:39

oi pessoal.. estou com um problemas:

eu tenho uma pagina que tem uns campos que precisa ser substituido por algumas outras informaçoes

tem certos pontos no codigo html que ira ter um marcador "#"

ex:
<html>
...
<p>#nome#</p>
...
<p>#fone#</p>
...
</html>

preciso que ele procure td que estive entre "#" e substitua

ex:
<html>
...
<p>Harry Potter</p>
...
<p>555-00000</p>
...
</html>

e tbm:
<html>
...
<p>Gandalf</p>
...
<p>555-111111</p>
...
</html>

eu tenho um form, com umas input que eu deverei colocar os nomes e os fone, mandarei para essa pagina onde tem os "#" e ela salvara uma ".html" ja trocada as info

obrigado desde ja
Não leve a vida tão a sério, você não sairá vivo dela mesmo!!

=D

#2 Marcos Aurélio

Marcos Aurélio

    Das terras geladas da Sibéria

  • Usuários
  • 208 posts
  • Sexo:Masculino

Posted 12/01/2008, 10:32

Regex nele! :P

$html = preg_replace('/#(^#)*#/i', '\\1', $html);

Não testei...

Edição feita por: Marcos Aurélio, 12/01/2008, 10:33.


#3 Biel 061

Biel 061

    Novato no fórum

  • Usuários
  • 10 posts
  • Sexo:Não informado

Posted 12/01/2008, 10:59

ou simplesmente manda um str_replace(), bem mais simples :P

function replaceTag($tagName, $content, $all) {
	return str_replace("#".$tagName."#", $content, $all);
}

Eu acho bem mais simples do que usar regex...

#4 Marcos Aurélio

Marcos Aurélio

    Das terras geladas da Sibéria

  • Usuários
  • 208 posts
  • Sexo:Masculino

Posted 12/01/2008, 11:41

Depende....

Imagina se ele tiver 20 campos... 20 replaces?

É muito mais fácil ele criar um array com os índices iguais aos termos entre "#", e jogar o retrovisor como o índice. E, se mesmo assim não se contentar, ainda é mais prático usar o preg_match_all :P

*Gostei da sua função de uma função! :rolleyes:

Edição feita por: Marcos Aurélio, 12/01/2008, 11:46.


#5 Bruno Augusto

Bruno Augusto

    ∙•● Restarting... ●•∙

  • Usuários
  • 1968 posts
  • Sexo:Não informado
  • Localidade:Itajubá

Posted 12/01/2008, 13:55

Pior que é Biel. Não tem necessidade alguma de se empacotar a str_replace() desse jeito.

#6 Biel 061

Biel 061

    Novato no fórum

  • Usuários
  • 10 posts
  • Sexo:Não informado

Posted 12/01/2008, 16:50

eu não gosto de regex porque eu nunca me dou bem com expressões regulares...

#7 Marcos Aurélio

Marcos Aurélio

    Das terras geladas da Sibéria

  • Usuários
  • 208 posts
  • Sexo:Masculino

Posted 12/01/2008, 18:38

Normalmente não gostamos daquilo que não sabemos, já fui assim, hoje em dia penso que isso é ignorância :P

Regex é uma porta para diversos problemas, dá uma estudada que vale a pena.

#8 § Kenshin §

§ Kenshin §

    I'm coming back...!

  • Usuários
  • 574 posts
  • Sexo:Masculino
  • Localidade:BA
  • Interesses:Sou fã de linguagens direcionadas para a web, como php, (x)html, xml, wml.
    Também gosto de webdesign e ultimamente tenho me dedicado mais a aprender css, mysql, javascript, ajax e actionscript.
    Trabalho com os programas Dreamweaver, Illustrator e Flash.

Posted 13/01/2008, 02:03

eu não gosto de regex porque eu nunca me dou bem com expressões regulares...

nunca eh tarde para comecar.
da uma olhada aqui.
leitura empolgante e exemplos faceis de entender.

vlw ^_^
Web Developer / Web Designer / Information Architect
"Living to learn... learning to live!"
Useful links: Rules | Search

#9 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 13/01/2008, 02:30

Não vejo utilidade em usar ER quando não é preciso (substituição simples). Quanto a questão da performance, garanto que str_replace() é mais rápida neste caso. Lembrando que str_replace() não precisa ser chamada N vezes, ela aceita vetores. :)

O próprio manual é enfático:

[...] If you don't need fancy replacing rules (like regular expressions), you should always use this function instead of ereg_replace() or preg_replace().

Você até poderia fazer isso:

$nome = 'foo';
$fone = '123';

$depois = preg_replace('{#([^#]+)#}e', '${\1}', $antes);
Mas isso aqui é bem mais rápido/indicado:

$depois = str_replace(array('#nome#', '#fone#'), array('foo', '123'), $antes);
Num simples teste de performance aqui, com 100 mil iterações, a preg_replace() demonstrou-se mais de 7 vezes lenta que str_replace(). O teste foi repetido várias vezes. ;)

[]’s :DAté mais

#10 Marcos Aurélio

Marcos Aurélio

    Das terras geladas da Sibéria

  • Usuários
  • 208 posts
  • Sexo:Masculino

Posted 13/01/2008, 10:04

Isso depende do modo que ele for usar. Usando o str_replace ele terá que ter a lista das tags no PHP, o que eu acho desnecessário, visto que ele pode fazer isso dinâmicamente, ao invés de pegar tag por tag...

#11 savior

savior

    Campanha [codebox], use ou morra :D

  • Usuários
  • 1229 posts
  • Sexo:Masculino
  • Localidade:Curitiba, PR - Brasil
  • Interesses:Na vida ;P

Posted 13/01/2008, 10:21

Seria trocar 6 por meia dúzia entre preg_replace e str_replace ...

Mas ali é coisinha básica MA ... é só ele fazer algo assim com str_replace, vendo que ele tem pouca experiência com expressões regulares...
$dados = array('#nome#' => "Joaozinho",'#email#' => "blablabla@blablabla.com",'#outracoisa#' => "lalalala");
$str =  str_replace (array_keys($dados), array_values($dados), $str);

[lastfm] [blog]

Campanha codebox: use-a ou morra!
bfmaster_duran[at]yahoo.com.br


#12 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 13/01/2008, 12:32

Isso depende do modo que ele for usar. Usando o str_replace ele terá que ter a lista das tags no PHP, o que eu acho desnecessário, visto que ele pode fazer isso dinâmicamente, ao invés de pegar tag por tag...

Isto independe dos fins. Nem sempre "otimizar" realmente otimiza algo. Menos código não quer dizer mais performance, longe disso. A propósito, a substituição continuará sendo dinâmica. :)

As funções baseadas nas biblioteca PCRE e POSIX não são otimizadas para isso. Elas são otimizadas sim, mas para trabalhar com expressões regulares. A função str_replace() não é nenhuma vilã no ponto de vista técnico, pelo contrário, ela é suficientemente otimizada para substituições simples. A prova disso tu obtém ao rodar ambos códigos num mesmo números de iterações. ;)

$str =  str_replace (array_keys($dados), array_values($dados), $str);

Bem lembrado. :)

[]’s :DAté mais

#13 ciclone

ciclone

    Novato no fórum

  • Usuários
  • 23 posts
  • Sexo:Não informado

Posted 13/01/2008, 22:30

Se fosse pra mim eu faria assim...

<?
$imputs = array($_POST['nome'], $_POST['fone']);
$replace = array('#nome#', '#fone#');

$html = '
<html>
<p>#nome#</p>
<p>#fone#</p>
</html>';

echo str_replace($replace,$imputs,$html);
?>

#14 HdN

HdN

    Turista

  • Usuários
  • 37 posts
  • Sexo:Masculino
  • Localidade:Bauru - SP

Posted 13/01/2008, 23:42

nussaaa, isso viro um debate.. rs....

muito obrigado, tem coisa que eu nao sabia que tinha..

vou pesquizar e vou testar todos



valeu e um abraço

//---------------------------------------------------------------
aproveitando o topico...

to querendo uma script ou função que bloqueie certos IP ao meu site

ex: tds ips que comece com 200.x.x.x, nao vera o site

nao sei se fui claro..


queria uma função pra bloquear certas classes de IP ao meu site,


obrigado
Não leve a vida tão a sério, você não sairá vivo dela mesmo!!

=D

#15 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 14/01/2008, 00:44

Era melhor ter feito um novo post, para ficar mais fácil de achar depois, entende? :)

Enfim...

Antes de tudo, tu terá que usar uma boa técnica para capturar o IP. Eu havia feito algo certa vez, mas o Guilherme Blanco postou uma função aparentemente melhor, mais fácil de achar por sinal: get_ip() ;)
Feito isso, tu tem que definir como será as regras de bloqueio. Questões de sintaxe e tal.

Vou mostrar um exemplo bem simples seguindo tua linha de raciocínio:

<?php

$pattern	 = '127.0.0.x'; // exemplo para testes locais :P
$remote_addr = $_SERVER['REMOTE_ADDR'];
$regexp	  = str_replace(
				 array('.', 'x'),
				 array('\.', '(?:(?:1[0-9]|[1-9]?)[0-9]|2(?:[0-4][0-9]|5[0-5]))'),
				 $pattern
			   );

if (preg_match("{{$regexp}}", $remote_addr)) {
	// bloquear IP
} else {
	// liberar IP
}

?>
Claro que isso pode ser lapidado. Por exemplo, tu poderia aprimorar o sistema para operar com faixas de IPs, tipo 192.168.0.1-100. Quanto a isso, deixo pra você... :assobio:

[]’s :DAté mais




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq