[PHP] ricerca caratteri accentati

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.044
150
63
PR
www.borgo-italia.it
ciao
una mia curiosità in quanto lo script che ho fatto ora funziona e questa è la cosa principale.
comunque vorrei sapere il perchè.
ho fatto un piccolo motore di ricerca che cerca una parola e una piccola frase in un testo, inserendola mi mostra i link di tutte le pagine in cui la parola o la frase viene trovata.
il problema è nato con le parole che contencono caratteri accentati (à, è....).
prendiamo ad esempio che nella pagina ci sia il testo Arquà Petrarca

1° prova
lo script che cerca la parola/frase era
PHP:
if (preg_match("/\b".$cerca."\b/i", $speciale)){
    //.....
    }//.....
dove $cerca la parola/frase da cercare e $speciale il testo dove cercare
inserendo nel form di ricerca Arquà o Arquà Petrarca sempre corrispondenza non trovata

2° prova
mi sono ricordato che nell'html non è scritto Arquà Petrarca, ma Arquà Petrarca per cui, dopo varie prove ho corretto lo script in
PHP:
$rep=array('à','è','é','ì','ò','ù');
$con_01=array('à','è','é','ì','ò','ù');
$cerca_01=str_replace($rep, $con_01, $cerca);
//...
if (preg_match("/\b".$cerca."\b/i", $speciale) || preg_match("/\b".$cerca_01."\b/i", $speciale)){
    //.....
    }//.....
e primo mistero
inserendo Arquà -> corrispondenza non trovata
inserendo Arquà Petrarca -> crea il link alla pagina in cui la frase c'è

3° prova
dopo vari esperimenti ho modificato l'array $con aggiungendo uno spazio dopo il ;
PHP:
$con_01=array('à ','è ','é ','ì ','ò ','ù ');
risultato
inserendo Arquà -> crea il link alla pagina in cui la parola c'è
inserendo Arquà Petrarca -> corrispondenza non trovata

4° prova
che finalmente funziona
PHP:
$rep=array('à','è','é','ì','ò','ù');
$con_01=array('à','è','é','ì','ò','ù');
$con_02=array('à ','è ','é ','ì ','ò ','ù ');
$cerca_01=str_replace($rep, $con_01, $cerca);
//...
if (preg_match("/\b".$cerca."\b/i", $speciale) || preg_match("/\b".$cerca_01."\b/i", $speciale) || preg_match("/\b".$cerca_02."\b/i", $speciale)){
    //.....
    }//.....
risultato
inserendo Arquà -> crea il link alla pagina in cui la parola c'è
inserendo Arquà Petrarca -> crea il link alla pagina in cui la frase c'è

chi sa spiegarmi il mistero di quello spazio che esiste e non esiste?
 
Hai provato una cosa del genere per trovare i caratteri unicode con le regex? Potrebbe semplificarti lo script.
Codice:
preg_match('/[\p{L}]+/u', $text);

Dove $text può essere.. " Matatàèéìòù ", ho provato qui e funge..
https://regex101.com/r/uSylSL/1
 
ciao
si quello trova i caratteri unicode, ma non devo solo cercare il carattere, ma o una parola o una frase
nell'html ho ad esmpio
HTML:
<p>
una gita al sole<br />
oggi mi sono recato ad Arqu&agrave; Petrarca con il sole
</p>
deve trovarmi la pagina sia cercando solo Arquà o cercando Arquà Petrarca, da input del form
tra l'altro ho dovuto lasciare i caratteri non trasformati in quanto su alcuni vecchi file il carattere risulta come è, cioi es. ì e non &igrave; (per quello l'OR nell'if).
comunque quello che non capisco è se cerco una parola singola devo aggiungere uno spazio e se invece la parola è nella frase no

p.s.
avevo comunque già provato con altri metodi vari preg, htmlspecialchars ecc....

dimenticavo
in quel preg_match("/\b".$cerca."\b/i".... $cerca contene la parola o la frase (Arquà o Arqua Petrarca) che sto cercando nel test $speciali
 
Questo potrebbe interesarti: usando \b".$cerca."\b la regex è soddisfatta quando la parola è preceduta o seguita da un terminatore di parola ( spazio, punto, punto esclamativo, virgola, coppia di virgolette, inizio e fine stringa.. )
 

Discussioni simili