ok graz...
ok graz...
Il problema è str_replace;
quando inseriamo (tipo casa+a)
in questo ciclo prima $word=casa e str_replace sostituisce casa con <span style=\"background: {$colore}\">casa</span>Codice:foreach($array as $word){ $colore = generacolore(); $cerca["text"] = str_replace($word, "<span style=\"background: {$colore}\">{$word}</span>", $cerca["text"]); }
dopo $word=a e str_replace non fa caso se il carattere trovato è da solo o se fa parte di una stringa; perciò la prima "a" che incontra anche che fa parte di una stringa la sostituisce con <span style=\"background: {$colore}\">a</span>, in questo caso la prima "a" che incontra è quella dello span <span style=\"background: {$colore}\">a</span>
e la sostituisce <sp<span style=\"background: {$colore}\">a</span>n style=\"background: {$colore}\">a</span>
mi sono spiegato bene?
credo di si...
per risolvere questo problema che devo fare...
come hai detto tu prima mi dava errore...
Io l'ho risolto così, devi sostituire questo:
con questo:Codice PHP:
$array = array();
$tok = strtok($parola, " ");
while($tok !== false){
array_push($array, $tok);
$tok = strtok(" ");
}
vedi se per te va bene.Codice PHP:
$array = array();
$tok = strtok($parola, " ");
while($tok !== false){
if(strlen($tok) == 1)
array_push($array, ' '.$tok.' ');
else
array_push($array, $tok);
$tok = strtok(" ");
}
ehehe funziona almeno per ora...
ma ci sono alcune cose che devo sistemare...
1)dovrei fare tipo se mette una sola lettera compaia un messaggio tipo alert e la pagina rimane quella di prima del invio
2)dovrei fare tipo scrivi cia
lui ti trova gia la parola ciao sensa che tu la scrivi tutta la parola ciao o applicare Levenshtein
per suggerire dei risultati in caso la parola non si trovi che ne pensi
3)dovrei escludere dai risultati tutto quello che si trova prima di [ e finisca con ]
tipo
[co de]ciao[/co de]
non deve comparire [co de]ciao[/co de]
1)così:
3)Cosa devi fare? Vuoi eliminare da una stringa [co de]ciao[/co de]?Codice PHP:
<script type="text/javascript">
//<![CDATA[
function controll(form){
var name = form.parola.value;
if(name == null || name == '' || trim(name) == '' || strlen(name) == 1){
alert("..........");
return false;
}
return true;
}
function trim(str){
if(str != null){
while(str.substring(0, 1) == ' '){
str = str.substring(1, str.length);
}
while(str.substring(str.length - 1, str.length) == ' '){
str = str.substring(0, str.length - 1);
}
}
return str;
}
function strlen (string) {
// Get string length
//
// version: 909.322
// discuss at: http://phpjs.org/functions/strlen
// + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + improved by: Sakimori
// + input by: Kirk Strobeck
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + bugfixed by: Onno Marsman
// + revised by: Brett Zamir (http://brett-zamir.me)
// % note 1: May look like overkill, but in order to be truly faithful to handling all Unicode
// % note 1: characters and to this function in PHP which does not count the number of bytes
// % note 1: but counts the number of characters, something like this is really necessary.
// * example 1: strlen('Kevin van Zonneveld');
// * returns 1: 19
// * example 2: strlen('A\ud87e\udc04Z');
// * returns 2: 3
var str = string+'';
var i = 0, chr = '', lgth = 0;
var getWholeChar = function (str, i) {
var code = str.charCodeAt(i);
var next = '', prev = '';
if (0xD800 <= code && code <= 0xDBFF) { // High surrogate (could change last hex to 0xDB7F to treat high private surrogates as single characters)
if (str.length <= (i+1)) {
throw 'High surrogate without following low surrogate';
}
next = str.charCodeAt(i+1);
if (0xDC00 > next || next > 0xDFFF) {
throw 'High surrogate without following low surrogate';
}
return str.charAt(i)+str.charAt(i+1);
} else if (0xDC00 <= code && code <= 0xDFFF) { // Low surrogate
if (i === 0) {
throw 'Low surrogate without preceding high surrogate';
}
prev = str.charCodeAt(i-1);
if (0xD800 > prev || prev > 0xDBFF) { //(could change last hex to 0xDB7F to treat high private surrogates as single characters)
throw 'Low surrogate without preceding high surrogate';
}
return false; // We can pass over low surrogates now as the second component in a pair which we have already processed
}
return str.charAt(i);
};
for (i=0, lgth=0; i < str.length; i++) {
if ((chr = getWholeChar(str, i)) === false) {
continue;
} // Adapt this line at the top of any loop, passing in the whole string and the current iteration and returning a variable to represent the individual character; purpose is to treat the first part of a surrogate pair as the whole character and then ignore the second part
lgth++;
}
return lgth;
}
//]]>
</script>
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="get" onsubmit="return controll(this);">
<input type="text" name="parola">
<input type="submit" value="INVIA">
</form>
1)mi sono accorto se scrivo
ciao a
mi compare una pagina bianca per questo voglio che avverti anche con echo in php che non bisogna inserire piu di una lettera...
3)si sai come posso fare
C'è qualcosa che non funziona!
Quando inserisco "ciao+a" funziona, invece quando inserisci "ciao a" non funziona;
forse hai modificato male lo script che ho scritto.
Codice PHP:
<?php
$parola = mysql_real_escape_string($_GET["parola"]);
if(isset($parola)){
$mysql = @mysql_connect('localhost', 'zappi', '');
mysql_select_db('my_zappi', $mysql);
$query = mysql_query("SELECT *, MATCH(testo) AGAINST('+$parola' IN BOOLEAN MODE) as score FROM tabella WHERE MATCH(testo) AGAINST('+$parola' IN BOOLEAN MODE) ORDER BY score DESC");
$array = array();
$tok = strtok($parola, " ");
while($tok !== false){
if(strlen($tok) == 1){
array_push($array, ' '.$tok.' ');
}else{
array_push($array, $tok);
$tok = strtok(" ");
}}
echo "<div class=\"titolo_cerca\">Risultati ricerca: " .$parola. "</div><br><br>\n";
echo "<div class=\"titolo_post\">Blog</div>\n";
echo "<table width=\"600\" border=\"0\" align=\"center\">";
while($cerca = mysql_fetch_array($query)){
foreach($array as $word){
$colore = generacolore();
$cerca["testo"] = str_replace($word, "\n<span style=\"background: {$colore}\">{$word}</span>\n", $cerca["testo"] );
}
echo
"
<tr>
<td class=\"titolo_post\">\n" .$cerca["titolo"]. "\n</td>
</tr>
<tr>
<td>Postato in [Blog] da il 06/09/2009</td>
</tr>
<tr>
<td class=\"testo\">\n".$cerca["testo"]."\n</td>
</tr>\n";
}}
echo "
</table>";
function generacolore(){
return '#'.dechex(rand(0, 16777215));
}?>
Non so sembra giusto però non funziona.
Ultima modifica di andreafallico : 12-10-2009 alle ore 19.13.23
hehehe...
vediamo posta il tuo...
per trovare problemi negli script sono il numero uno ^^
Ultima modifica di zappi : 12-10-2009 alle ore 19.35.08
Il mio:
Ora senza che modifichi niente, devi fare un copia e incolla, devi aggiungere solo i tuoi dati e poi metti il link alla pagina con questo codice.Capito?Codice PHP:
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="get">
<input type="text" name="parola">
<input type="submit" value="INVIA">
</form>
<?php
$parola = mysql_real_escape_string($_GET["parola"]);
if(isset($parola)){
$mysql = @mysql_connect('', '', '');
if($mysql == FALSE)
exit();
@mysql_select_db('', $mysql);
$query = mysql_query("SELECT *, MATCH(testo) AGAINST('+$parola' IN BOOLEAN MODE) as score FROM tabella WHERE MATCH(testo) AGAINST('+$parola' IN BOOLEAN MODE) ORDER BY score DESC");
$array = array();
$tok = strtok($parola, " ");
while($tok !== false){
if(strlen($tok) == 1)
array_push($array, ' '.$tok.' ');
else
array_push($array, $tok);
$tok = strtok(" ");
}
echo "<div class=\"titolo_cerca\">Risultati ricerca: " .$parola. "</div><br><br>\n\n\n";
echo "<table width=\"200\" border=\"0\" align=\"center\">";
while($cerca = mysql_fetch_array($query)){
foreach($array as $word){
$colore = generacolore();
$cerca["testo"] = str_replace($word, "<span style=\"background: {$colore}\">{$word}</span>", $cerca["testo"]);
}
echo
"\n<tr><td class=\"titolo_post\">\n" .$cerca["titolo"]. "\n</td></tr>
<tr><td class=\"testo\">\n".$cerca["testo"]. "<br>\n</td></tr>\n\n";
}}
echo "
</table>";
function generacolore(){
return '#'.dechex(rand(0, 16777215));
}?>
Il tuo restituisce questo errore:
Codice:Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 35 bytes) in /membri/zappi/cerca.php on line 48
ho fatto cosi e funziona...
se voi prova...^^
p.s.
per le modifiche che ti ho detto prima
come posso fare....
Codice PHP:
<?php
$parola = mysql_real_escape_string($_GET["parola"]);
if(isset($parola)){
$mysql = @mysql_connect('localhost', 'zappi', '');
if($mysql == FALSE)
exit();
@mysql_select_db('my_zappi', $mysql);
$query = mysql_query("SELECT *, MATCH(testo) AGAINST('+$parola' IN BOOLEAN MODE) as score FROM blog WHERE MATCH(testo) AGAINST('+$parola' IN BOOLEAN MODE) ORDER BY score DESC");
$array = array();
$tok = strtok($parola, " ");
while($tok !== false){
if(strlen($tok) == 1)
array_push($array, ' '.$tok.' ');
else
array_push($array, $tok);
$tok = strtok(" ");
}
echo "<div class=\"titolo_cerca\">Risultati ricerca: " .$parola. "</div><br><br>\n";
echo "<div class=\"titolo_post\">Blog</div>\n";
echo "<table width=\"600\" border=\"0\" align=\"center\">";
while($cerca = mysql_fetch_array($query)){
foreach($array as $word){
$colore = generacolore();
$cerca["testo"] = str_replace($word, "\n<span style=\"background: {$colore}\">{$word}</span>\n", $cerca["testo"] );
}
echo
"
<tr>
<td class=\"titolo_post\">\n" .$cerca["titolo"]. "\n</td>
</tr>
<tr>
<td>Postato in [Blog] da il 06/09/2009</td>
</tr>
<tr>
<td class=\"testo\">\n".$cerca["testo"]."\n</td>
</tr>\n";
}}
echo "
</table>";
function generacolore(){
return '#'.dechex(rand(0, 16777215));
}?>
Però il problema che ti avevo spiegato prima con str_replace rimane, fai una prova e nel tuo inserisci "ciao ci" guarda il risultato.
Quindi secondo me con str_replace non è fattibile la cosa; puoi utilizzare jquery.
2)dovrei fare tipo scrivi cia
lui ti trova gia la parola ciao sensa che tu la scrivi tutta la parola ciao o applicare Levenshtein
per suggerire dei risultati in caso la parola non si trovi che ne pensi
3)dovrei escludere dai risultati tutto quello che si trova prima di [ e finisca con ]
tipo
[co de]ciao[/co de]
non deve comparire [co de]ciao[/co de]
2)Per Levenshtein puoi guardare: qui.
3)Penso che si dovrebbe usare str_replace con una espressione regolare fatta per quello che vuoi tu.
cosi dici
$cerca["testo"] = str_replace([co de]$word[/co de], "", $cerca["testo"]);
Ultima modifica di andreafallico : 12-10-2009 alle ore 20.28.07
funziona ma non riesco a levare quello che sta al interno dfella tag code /code$cerca["testo"] = str_replace("[co de]", "", $cerca["testo"]);
$cerca["testo"] = str_replace("[/co de]", "", $cerca["testo"]);
Ma non dovrebbe essere tra virgolette?
Codice PHP:
$cerca["testo"] = str_replace("[code]$word[/code]", "", $cerca["testo"]);
Age Of Empires GIF Creator & Archive
New! Blog informatico di scripting PHP avanzato
Vuoi giocare online a Age of Empires The Conquerors? -> Usa Voobly !! (MSN Zone non lo supporta più dal 19 giugno 2006)
Il mio clan di The Conquerors -> Rifugio dei Conquerors
Il mio stato su Xfire Live Video -> Unreal Tournament 2004
Facebook MMORPG
Tutto quello racchiuso fra [CO DE][/CO DE] e [co de] [/co de] verrà cancellato.Codice PHP:
$cerca["testo"] = preg_replace("/\[code\](.*?)\[\/code\]/is", "", $cerca["testo"]);
grazie carlo...
1)fa la distinzione tra minuscole e maiuscole e vorrei che non le facesse...
non si puo fare vero...
2)e possibile fare che inserendo solo la lettera a o scrivere ci
ti trova tutti i post che hanno queste lettere invece di fare di trovare i post solo che con incidono solo con le frasi...
^^
1)2)Se ho capito bene:Codice PHP:
$cerca["testo"] = preg_replace("/\[code\](.*?)\[\/code\]/s", "", $cerca["testo"]);
E usi $post_match, che avrà soltanto i dati che contengono a!Codice PHP:
$q = "a";
$post_match = array();
foreach($_POST as $key => $value) {
if(preg_match("/" . $q . "/", $value)) {
$post_match[$key] = $value;
}
}
Saluti!
no io dico questa parte
dove lo devo mettere di preciso io dico se per esempio scrivo ciCodice PHP:
$cerca["testo"] = str_replace($word, "\n<span style=\"background: {$colore}\">{$word}</span>\n", $cerca["testo"] );
già lui la trova lafrase che e ciao...
$q = "a";
$post_match = array();
foreach($_POST as $key => $value) {
if(preg_match("/" . $q . "/", $value)) {
$post_match[$key] = $value;
}
}
Non ho capito!
Quel codice possibilimente a inizio pagina!
Ti spiego il funzionamento di quel codice.
Con il loop foreach ottiene ogni chiave e valore dall'array post con la funzione controllo se nel valore c'è il contenuto della variabile $q, se c'è nell'array $post_macth, avrai tutti i dati che hanno "a" nel loro valore altrimenti non verrà inserito.
1) dico se io scrivo
ciao e diverso da Ciao o CIAO ho come altro e scritto
vorrei che non succedesse...
2)non ho capito bene
funziona solo con a e basta
io vorrei fare se scrivi cia o ci
lui trova gia la parola che e ciao o altra parola che si avvicina...^^
1) Lì è colpa di mysql non so come si imposta case insensitive!
2) In post_match hai dati filtrati. Comunque per le parole (tipo google) ti serve calcolare la distanza di levenshtein
1)pensi che non si possa sistemare...
2)no per ora non mi serve la distanza di leve...
ma un modo per migliorare la ricerca dei dati...
io vorrei fare se scrivi cia o ci
lui trova gia la parola che e ciao o altra parola che si avvicina...^^
e che gia lo fa vedere ciao...
si ma quello usa dei file di testo...
in pm ti invio link di un sito
asp cosi capisci...^^