Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal,
Não estou conseguindo retornar todas as palavras correspondentes de uma String. Alguém pode me ajudar a finalizar este código?
function procpalavras ($frase, $palavras, $resultado = 0) {
foreach ( $palavras as $key => $value ) {
$pos = strpos($frase, $value);
if ($pos !== false) { $resultado = 1; break; }
}
return $value;
}
$frase = "meu amigo carlos amaral de 2ª a 6ª";
$palavras = array ("amigo","amaral","2ª","6ª");
echo procpalavras($frase, $palavras) . " | ";
Infelizmente, por não conseguir montar o loop, eu só consigo obter o seguinte retorno:
"amigo"
Mas eu gostaria que me retornasse todas as palavras correspondentes na frase:
"amigo | amaral | 2ª | 6ª "
Grato.
Olá Lambrusco,
Em primeiro lugar agradeço a atenção e disposição em me ajudar! Bom, fiz tudo de acordo com as suas orientações mas o código retorna sempre vazio.
=/
Poste o código por favor.
$campo34 = $_POST['campo34'];
function procpalavras ($frase, $palavras, $resultado = 0)
{
$arrFrase = explode(" ",$frase);
$arrAux = "";
foreach($arrFrase as $word)
{
if(in_array($word,$palavras))
{
$arrAux .= " | ".$word;
}
}
return $arrAux;
}
$frase = "$campo34";
$palavras = array ("domingo","2ª","3ª","4ª","5ª","6ª");
echo procpalavras($frase, $palavras);
a string "$campo34" vem de um formulário anterior que me retorna os valores de "checkboxes" anteriormente gravadas no banco de dados e que aparecem no FORM como:
value="a:6:{i:0;s:7:"domingo";i:1;s:3:"2ª";i:2;s:3:"3ª";i:3;s:3:"4ª";i:4;s:3:"5ª";i:5;s:3:"6ª";}"
Abs.
neste caso esta dando esse problema pq você colocou a ','
tente com
$arrFrase = explode(", ",$frase);
Não deu certo também não!!!
=/
O Form da página anterior é:
<form action='gerar-pdf.php' method='post'>
<input name='campo34' type='hidden' value='a:6:{i:0;s:7:"domingo";i:1;s:3:"2ª";i:2;s:3:"3ª";i:3;s:3:"4ª";i:4;s:3:"5ª";i:5;s:3:"6ª";}' />
</form>
O código que está na página gerar-pdf.php é:
header("Content-Type: text/html; charset=utf-8",true);
$campo34 = $_POST['campo34'];
function procpalavras ($frase, $palavras, $resultado = 0)
{
$arrFrase = explode(", ",$frase);
$arrAux = "";
foreach($arrFrase as $word)
{
if(in_array($word,$palavras))
{
$arrAux .= " | ".$word;
}
}
return $arrAux;
}
$frase = $campo34;
$palavras = array ("domingo","2ª","3ª","4ª","5ª","6ª");
echo procpalavras($frase, $palavras);
Obs: eu verifiquei a página anterior e o value do campo34 está retornando cheio com o valor:
a:6:{i:0;s:7:"domingo";i:1;s:3:"2ª";i:2;s:3:"3ª";i:3;s:3:"4ª";i:4;s:3:"5ª";i:5;s:3:"6ª";}
Quando eu substituo a string "$frase = $campo34" por um valor digitado como "domingo, 2ª, 5ª" a função retorna OK.
Cara, use expressão regular para isso, é muito mais fácil.
Outro fator é utilizar unserialize neste $_POST[ 'campo34' ].
Veja:
<?php
header( 'Content-Type: text/html; charset=UTF-8' );
function search_words( $phrase, array $words )
{
$pattern = sprintf( '/(?P<result>%s)/i', implode( '|', $words ) );
$subject = ( string ) $phrase;
preg_match_all( $pattern, $subject, $matches );
return $matches[ 'result' ];
}
$phrase = 'meu amigo carlos amaral vai a escola de 2ª a 6ª e no domingo descansa';
$words = unserialize( 'a:6:{i:0;s:7:"domingo";i:1;s:3:"2ª";i:2;s:3:"3ª";i:3;s:3:"4ª";i:4;s:3:"5ª";i:5;s:3:"6ª";}' );
var_dump( search_words( $phrase, $words ) );
?>
Saída:
array
0 => string '2ª' (length=3)
1 => string '6ª' (length=3)
2 => string 'domingo' (length=7)
Você terá um array com as palavras, agora se você quiser unir da forma "valor 1|valor2" é só meter um implode.
echo implode( '|', search_words( $phrase, $words ) );
Olá Carlos,
Obrigado pelos esclarecimentos. Mas eu fiz de acordo com as suas instruções e me retornou o seguinte erro:
Catchable fatal error: Argument 2 passed to search_words() must be an array, boolean given, called in /home/www/gerar-pdf.php on line 20 and defined in /home/www/gerar-pdf.php on line 5
A string $phrase precisaria necessariamente puxar o resultado do campo34 do formulário da página anterior e que está na atual (gerar-pdf.php) como a string $campo34.
Ou seja, onde você colocou "$words = unserialize ('a:6:{...)" deveria ser o $campo34? ou as palavras que quero achar no $campo34? Pois as palavras a serem buscadas sempre serão: "domingo","2ª","3ª","4ª","5ª","6ª".
O que deveria ser "unserializado" seria o $campo34, não?
Abs.
Como eu expliquei, é para pegar **$_POST[ 'campo34' ]**
$words = unserialize( $_POST[ 'campo34' ] ); // que é 'a:6:{...'
Ou apenas
$words = array( 'domingo', 'hoje' ); // array com as palavras que você quer encontrar
Ok Carlos,
na verdade a única coisa de que preciso é transformar esta string:
a:6:{i:0;s:7:"domingo";i:1;s:3:"2ª";i:2;s:3:"3ª";i:3;s:3:"4ª";i:4;s:3:"5ª";i:5;s:3:"6ª";}
nisso daqui:
domingo 2ª 3ª 4ª 5ª 6ª
É possível fazer isso? Você poderia me mostrar qual código eu utilizo para fazer isto? Se eu conseguir transformar aquela string gigante em apenas no modo resumido já me ajudaria.
<?php
$string = 'a:6:{i:0;s:7:"domingo";i:1;s:3:"2ª";i:2;s:3:"3ª";i:3;s:3:"4ª";i:4;s:3:"5ª";i:5;s:3:"6ª";}';
echo implode( ' ', unserialize( $string ) );
// domingo 2ª 3ª 4ª 5ª 6ª
?>
Carlos,
Utilizando o seguinte código:
$string = 'a:6:{i:0;s:7:"domingo";i:1;s:3:"2ª";i:2;s:3:"3ª";i:3;s:3:"4ª";i:4;s:3:"5ª";i:5;s:3:"6ª";}';
echo "Resultado: " . implode(', ', unserialize($string));
Me retorna o seguinte erro:
Warning: implode() [function.implode]: Invalid arguments passed in /www/gerar-pdf.php on line 4
Resultado:
Fiz alguma coisa errada?
Teste o que postei aqui :seta: http://sandbox.onlinephpfunctions.com/
Se os valores serão sempre os mesmos como você falou, crie logo um array que é mais fácil.
Mas esse é o problema pois os valores serão sempre diferente pois:
de um usuário vem: a:6:{i:0;s:7:"domingo";i:1;s:3:"2ª";i:2;s:3:"3ª";i:3;s:3:"4ª";i:4;s:3:"5ª";i:5;s:3:"6ª";}
de outro usuário vem: a:1:{i:0;s:7:"domingo";}
de outro usuário vem: a:3:{i:0;s:3:"4ª";i:1;s:3:"5ª";i:2;s:3:"6ª";}
Sempre vem um valor diferente, mas eu preciso saber como retirar esse monte de "," ";" "s" ... e deixar somente a resposta ou registro do valor que vem do banco de dados, entendeu?
Interessante: o código que você falou funcionou no site de testes de códigos, mas parece que no meu servidor KingHost ele não funciona!
Isso é por causa da codificação, tente usando utf8_decode
echo implode( ' ', unserialize( utf8_decode( $string ) ) );
Referente a sua dúvida...
Não tem que complicar, veja:
function search_words( $phrase, array $words )
{
$pattern = sprintf( '/(?P<result>%s)/i', implode( '|', $words ) );
$subject = ( string ) $phrase;
preg_match_all( $pattern, $subject, $matches );
return $matches[ 'result' ];
}
$phrase = 'meu amigo carlos amaral vai a escola de 2ª a 6ª e no domingo descansa';
$words = 'a:6:{i:0;s:7:"domingo";i:1;s:3:"2ª";i:2;s:3:"3ª";i:3;s:3:"4ª";i:4;s:3:"5ª";i:5;s:3:"6ª";}';
$words = unserialize( utf8_decode( $words ) );
echo
'Phrase: ', $phrase, '<br/>',
'Result: ', implode( ' | ', search_words( $phrase, $words ) );
Ok Carlos,
É isso mesmo... você tem razão, pra quê complicar!!! Bom, essa solução sua foi eficaz e funcionou.
Muito obrigado!
Seu objetivo é exibir as palavras que foram encontradas na frase é isso ?
function procpalavras ($frase, $palavras, $resultado = 0)
{