Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923

    [Php] regexp. evidenziare pių parole in una stringa

    Ciao a tutti. Vorrei sapere se č possibile scrivere un'espressione regolare (immagino di sė) che mi semplifichi questo lavoro, evitando di usare un ciclo.

    In pratica date alcune parole, nel caso le trovi all'interno del testo me le deve evidenziare.
    risultato
    il cane era sotto l'albero del giardino
    Attendo notizie dai guru delle regexp.

    Codice PHP:
    <?php
    $pattern 
    'albero cane giardino';
    $stringa "il cane era sotto l'albero del giardino";
    $pattern=explode(' ',$pattern);
    foreach(
    $pattern as $chiave=>$valore)
        
    $pattern[$chiave] = "/\\b$valore\\b/i";
    $stringa preg_replace($pattern,"[b]$0[/b]",$stringa);
    echo 
    $stringa;
    ?>
    edit: le parole vengono inviate tramite un form. Forse non c'č alternativa al codice di sopra. :master:

  2. #2

    ..........

    Ciao.
    Magari ho capito male ma lascerei
    le regular expression e risolverei
    semplicemente cosė:
    $search = array('albero', 'cane' ,'giardino');
    $replace = array('albero', 'cane' ,'giardino');
    $string = "il cane era sotto l'albero del giardino";
    $newstrting = str_replace($search,$replace,$string);
    echo $newstrting;
    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  3. #3
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Ciao whisher. La tua soluzione non va bene. Innanzitutto mi evidenzierebbe solo le parole nelle quali coincidano maiuscole e minuscole non potendo usare str_ireplace(). (si potrebbe anche ovviare a quello ma non risolverei il mio problema).
    In secondo luogo prova ad aggiungere una parola come casa tra quelle da ricercare e accasato nel testo:

    $search = array('Albero', 'cane' ,'giardino','casa');
    $replace = array('albero', 'cane' ,'giardino','casa');
    $string = "il cane era accasato sotto l'albero del giardino";
    $newstrting = str_replace($search,$replace,$string);
    echo $newstrting;

    il tuo script mi restituisce questo
    il cane era accasato sotto l'albero del giardino

    non evidenzia albero perchč lo cerco con l'niziale maiuscola e mi evidenzia casa all'interno di un'altra parola mentre io voglio solo le parole intere.

    In pratica ciō che mi chiedevo era se fosse possibile fare il confronto senza prima esplodere la stringa di ricerca ma mi sa proprio di no.

    Ti ringrazio comunque per l'interessamento.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    1
    Come hai giā capito devi prima manipolare la stringa di ricerca costruendo la regex come stringa composta da tutte le parole suddivise dagli OR |. Se vuoi usare le regex puoi fare una cosa tipo:
    \b(albero|cane|giardino)\b
    se vuoi che trovi solo le parole esatte e non composte.
    Poi ci sarebbe da tenere conto anche dell'ordine delle parole. pescecane andrebbe prima di cane.

  5. #5
    Originariamente inviato da maj
    Come hai giā capito devi prima manipolare la stringa di ricerca costruendo la regex come stringa composta da tutte le parole suddivise dagli OR |. Se vuoi usare le regex puoi fare una cosa tipo:
    \b(albero|cane|giardino)\b
    se vuoi che trovi solo le parole esatte e non composte.
    Poi ci sarebbe da tenere conto anche dell'ordine delle parole. pescecane andrebbe prima di cane.
    ehm, ero io da casa di amici.
    dA .. foto di viaggio
    L'esperienza č il tipo di insegnante pių difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    ciao anakin. scusa ma la differenza nell'ordine tra cane e pescecane non l'ho proprio capita.

    $stringa = "il cane era sotto l'albero del giardino pescecane accasato";
    $stringa = preg_replace("/\b(Albero|CANE|giardino|pescecane|casa)\b/i","$0",$stringa);
    echo $stringa;

    con una situazione del genere che problemi crea l'ordine dei due?

  7. #7
    Hai ragione, ho fatto casino. In realtā volevo dire che se nel caso avessi voluto fare un matching non esatto delle parole, senza i boundary \b, avresti dovuto tenere conto dell'ordine delle parole. L'esempio corretto sarebbe vapore/vaporetto.
    dA .. foto di viaggio
    L'esperienza č il tipo di insegnante pių difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

  8. #8
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Originariamente inviato da AnĒkin
    Hai ragione, ho fatto casino. In realtā volevo dire che se nel caso avessi voluto fare un matching non esatto delle parole, senza i boundary \b, avresti dovuto tenere conto dell'ordine delle parole. L'esempio corretto sarebbe vapore/vaporetto.
    Ah,ok. Giā ci capisco poco di espressioni regolari. Temevo di dover considerare pure qualche altro fattore.

  9. #9
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Allora, continuando con le mie prove sono arrivato a questo punto. In pratica dalla stringa inserita dall'utente elimino le parole pių corte di 3 caratteri e gli apostrofi.
    Mi sembra che funzioni a dovere ma allo stesso tempo la trovo molto farraginosa come soluzione. Stavo pensando allora di impedire a priori l'inserimento di termini inferiori ai 3 caratteri come avviene in questo forum ma non saprei come fare. Inoltre ho fatto alcune prove.
    Se nel forum scrivo "cd vari" il forum mi restituisce questo messaggio:
    Il termine da ricercare che hai inserito(cd) ha caratteri inferiori al minimo di (3) e pertanto non potrā essere trovato; prova con qualche altro termine.
    Se invece scrivo "i array" la ricerca la effettua senza problemi anche se i č di una sola lettera. Vorrei capire come funziona la cosa. Grazie ancora.


    codice:
    $ricerca = "il cane era sotto l'Albero del giardino e riposo";
    //$pattern = preg_replace('/[ ]{2,}/', ' ', $ricerca); sembra che se ne possa fare a meno
    // elimino dalla stringa le parole pių corte di 3 caratteri e gli apostrofi
    $pattern = array("/\b([[:alpha:]]{1,3})\b/i","/'/");
    $pattern = preg_replace($pattern, "", $ricerca);
    echo $pattern;
    echo "
    ";
    
    $stringa = "il cane era a riposo sotto l'albero del ,giardino";
    $pattern = explode(' ',$pattern);
    
    // con questo ciclo elimino gli elementi vuoti dall'array
    foreach($pattern as $chiave=>$valore)
    	if($pattern[$chiave] == '')
    		unset($pattern[$chiave]);
    
    foreach($pattern as $chiave=>$valore)
    	$pattern[$chiave] = "/\b$valore\b/i"; 
    $stringa = preg_replace($pattern,"$0",$stringa);
    echo '
    ';
    echo $stringa;

  10. #10
    Come funzioni la ricerca del forum non saprei, per escudere parole di tre caratteri io userei una cosa del genere:
    codice:
    preg_match_all('/\w{4,}/',$ricerca,$mth) ; 
    # $mth[0] <---
    mth[0] contiene parole piu lunghe di 3 caratteri e nessun elemento vuoto, poi lo pulisci da eventuali doppioni con array_unique e infine ti costruisci la regex implodendo con "|".

    edit: serve anche uno strtolower($ricerca) prima,/o nella,preg perche array unique č case sensitive.
    dA .. foto di viaggio
    L'esperienza č il tipo di insegnante pių difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.