Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa noite pessoal,
Estou com o seguinte problema: ao enviar uma variavel pela expressão regular, não consigo obter o valor exato da variavel e sim algo que está codificando ela.
Ex.:
function bbCode($string) {
$valores = array(
'@\atracao\\[\/atracao\]@i'
);
$html = array(
atracaoDestaque("$1")
);
$resto = preg_replace($valores, $html, $string);
return $resto;
}
Quero fazer com que o texto que o usuário colocou entre [atracao][/atracao] seja buscado no banco através de uma função.
A função é essa:
function atracaoDestaque($atracao) {
$atracao = mysql_real_escape_string($atracao);
$sql = mysql_query("SELECT * FROM atracoes WHERE atracao = '$atracao'");
}
Aí chega o problema. Ao invés de buscar o que o usuário digitou, ele está buscando por $1. Percebi isso ao dar um print_r na cláusula. Já tentei usar o escape para pegar o valor real da variável, mas não solcucionou o problema.
O que estou fazendo de errado pessoal??
Obrigado desde já!!
Victor, disso eu sei! Pelo que entendi nas expressões regulares, pra eu conseguir pegar o resultado de (.*?) é definindo $1, $2 e respectivamente desta maneira.
Você conhece alguma outra?
Existem algumas falhas na sua ER. Veja as modificações a seguir:
<?php
function x($x) {
return '<strong>-'.$x.'-</strong>';
}
function bbCode($string) {
$valores = array (
'/\atracao\\[\/atracao\]/ie'
);
$html = array (
"x($1)"
);
$resto = preg_replace($valores, $html, $string);
return $resto;
}
echo bbCode('fsdfssfsdfs [atracao]adhadhasudhaidahsiudah[/atracao] sfjasudahsiudh');
?>
Resultado:
fsdfssfsdfs -adhadhasudhaidahsiudah- sfjasudahsiudh
1 - Em ERs, podemos capturar as "variáveis" originadas a partir dos agrupamentos de chars, mas não podemos originalmente utilizá-las em funções do PHP. Para isso, utilizei o modificador /e.
2 - Otimizei alguns pontos da ER, mas dentre eles, destaco o seguinte: Evite o uso de coringas em excesso. Antes você estava capturando o conteúdo a ser substituído com ".", e logo em seguida um "?". Isso significa: capture OPCIONALMENTE (por causa do ?), qualquer caractere inclusive nada (por causa do , que não se importa se há conteúdo ou não, retirando a necessidade do uso do "?"). Mas e se ele encontrasse um "["? Ele iria capturar igualmente. Então o que eu fiz? Uma lista negada, falando para ele capturar qualquer coisa até encontrar um abre-colchetes "[", independentemente da quantidade.
Abraço!
Matheus, muito obrigado pela ajuda. Ainda não testei, vou testar agora na hora do almoço, pois estou no trabalho.
Mas, já aproveitando suas mudanças, queria umas explicações caso possa me ajudar:
O sinal de ˆ não diz "mostrar o que não deve ocorrer". Então neste caso está dizendo que na area onde irá capturar as informações não deve conter o ']', é isso??
Já o * fora diz que pode conter qualquer caractere! Certo?
Agora com relação ao /e, ele diz que posso usar a variável em uma função???
Obrigado pela força cara, e assim que eu testar respondo aqui!!
1 - Exatamente. Se ele encontrar um ], significa que terminou a busca e prossegue na ER...
2 - Não. Ele só diz a quantidade de caracteres [^]] que podem ser encontrados. * = Nenhum ou quantos precisar / + = Somente 1 pra cima / {i,j} = minimo/maximo / {x} = Exatamente "x"
2.1 - Para afirmar ao script que pode conter qualquer caractere, em qualquer quantidade, sobre qualquer ocasião, usa-se o famoso ".*", que você estava usando antes.
3 - Sim. Com mais detalhes, do PHP.NET: "If this modifier is set, preg_replace() does normal substitution of backreferences in the replacement string, evaluates it as PHP code, and uses the result for replacing the search string. Single quotes, double quotes, backslashes (\) and NULL chars will be escaped by backslashes in substituted backreferences."
Abraço ;)
Matheus, valeu demais cara. Deu tudo certo!! Valeu pela explicação e pela solução do problema!!
Muito obrigado. Abraços
leia
http://www.php.net/manual/pt_BR/language.variables.basics.php
variáveis não podem começar com números