Caratteri speciali nel campo ricerca

Aperto da directy, Lunedì - 06 Giugno 2016 - 16:13

0 Utenti e 1 Visitatore stanno visualizzando questa discussione.

directy

Ciao, mi segnalano questo problema
dal campo ricerca non è possibile cercare stringhe che contengono il carattere &
ad esempio se cerco la stringa 'Tips&Tricks' non verrà restituito nulla... esiste una soluzione?

marco

Flavio93Zena

Usi utf-8 come set caratteri del forum? Errori nel registro? Mod? Versione smf?

emanuele

Interessante comportamento.
Al primo colpo in locale son riuscito a cercarlo, poi ha smesso, indagando pare che all'inizio riusciva a dividere la stringa correttamente in corrispondenza della "&", ad un certo punto (nel giro di un paio di tentativi) ha smesso e non ci è più riuscito, finendo per cercare la stringa intera.
Perché non funziona il cercare la stringa intera?
Perché nel database la & è salvata come entità html &amp ;, quindi cercare "tips&tricks" non trova "tips& amp;tricks" perché, "ovviamente" son due stringhe diverse.

Presumibilmente si può catalogare come bug, con un paio di modifiche al codice si può farlo "funzionare" come atteso, il problema è che non son sicuro delle implicazioni (dato che il codice della ricerca è piuttosto complesso e non lo conosco quasi per niente...).
A tuo rischio e pericolo.
In Search.php, cerca:
$stripped_query = preg_replace('~(?:[\x0B\0' . ($context['utf8'] ? ($context['server']['complex_preg_chars'] ? '\x{A0}' : "\xC2\xA0") : '\xA0') . '\t\r\s\n(){}\\[\\]<>!@$%^*.,:+=`\~\?/\\\\]+|&(?:amp|lt|gt|quot);)+~' . ($context['utf8'] ? 'u' : ''), ' ', $search_params['search']);

sostituisci con:
$stripped_query = preg_replace('~(?:[\x0B\0' . ($context['utf8'] ? ($context['server']['complex_preg_chars'] ? '\x{A0}' : "\xC2\xA0") : '\xA0') . '\t\r\s\n(){}\\[\\]<>!&@$%^*.,:+=`\~\?/\\\\]+|&(?:amp|lt|gt|quot);)+~' . ($context['utf8'] ? 'u' : ''), ' ', $search_params['search']);


cerca:
$wordArray = explode(' ', preg_replace('~(?:^|\s)(?:[-]?)"(?:[^"]+)"(?:$|\s)~' . ($context['utf8'] ? 'u' : ''), ' ', $search_params['search']));
sostituisci con:
$wordArray = explode(' ', preg_replace('~(?:^|\s)(?:[-]?)"(?:[^"]+)"(?:$|\s)~' . ($context['utf8'] ? 'u' : ''), ' ', $stripped_query));

* emanuele sente puzza di bruciato

directy

Citazione di: Flavio93Zena il Lunedì - 06 Giugno 2016 - 21:43
Usi utf-8 come set caratteri del forum? Errori nel registro? Mod? Versione smf?
Si uso UTF-8, nessun errore nel registro, solo la mod di tapatalk e uso l'ultima versione di smf.
L'errore lo si può riscontrare anche in questo forum cercando 'tips&tricks'. Nei risultati dovremmo trovare almeno questa pagina che contiene la stringa inserita e invece nulla.

Citazione di: emanuele il Lunedì - 06 Giugno 2016 - 23:25
Perché non funziona il cercare la stringa intera?
Perché nel database la & è salvata come entità html &amp ;, quindi cercare "tips&tricks" non trova "tips& amp;tricks" perché, "ovviamente" son due stringhe diverse.
immaginavo qualcosa del genere...

Citazione di: emanuele il Lunedì - 06 Giugno 2016 - 23:25
Presumibilmente si può catalogare come bug, con un paio di modifiche al codice si può farlo "funzionare" come atteso, il problema è che non son sicuro delle implicazioni (dato che il codice della ricerca è piuttosto complesso e non lo conosco quasi per niente...).
A tuo rischio e pericolo.
Provo e vi faccio sapere. mal che vada ripristino il vecchio file. Impattando solo su questo carattere non dovrebbe dare altri problemi no? basta fare qualche test e si vede...

emanuele

Ci sono cose su cui non mi metto a scommettere, una di queste è cosa succede se cambi qualcosa nella ricerca. XD (L'altro è il login LOL.)

directy

ok ho provato... con questa modifica trova la stringa ma non riconosce il carattere '&'
trova tips&tricks

ma trova ad esempio
B&O
dove mi dice che 'Ogni parola deve essere lunga almeno due caratteri.'


Discussioni simili (3)