Molto spesso mi sono imbattuto in risultati di ricerca sul web dove la pagina web restituita era evidenziata nelle parti attinenti al testo ricercato… “molto interessante!” mi sono sempre detto… e poi spinto dalla curiosità di capire come funzionava mi sono imbattuto nelle Espressioni Regolari che mi hanno dato migliori performance di routine fatte ad-hoc per risolvere il problema… in pratica con una sola riga di codice mi è stato possibile fare il tutto.
Come?
Partendo dal presupposto che si conoscano almeno i concetti alle basi le regular expression (a tal proposito è stato messo un riferimento ad un tutorial di base) il pattern per identificare all’interno di un testo, per esempio, la parola CED (così come avviene su questo sito) è:
(?=[^\>]+<)(?=[^a-z])(?:CED)
Cosa fà? Semplice a descriverlo non tanto semplice nel comprendere quale illuminazione assurda ha folgorato la mia mente!
In pratica l’analisi dell’espressione è indicata nell’elenco puntato che segue:
- Estrai il termine CED (nell’espressione: (?:CED) ) che si trova in un contesto in cui:
- Prima del termine non ci sia alcun carattere compreso tra a e z (nell’espressione: (?=[^a-z]) )
- Che non sia il valore di un attributo o l’attributo stesso di un tag (nell’espressione (?=[^\>]+<) ).
Ovviamente poi bisonga formattarlo ed utilizzare le funzioni più appropriate in base al linguaggio di programmazione che viene utilizzato.
Un piccolo appunto ancora prima di lasciarvi alla singola riga di codice capace di fare ciò che è esposto nel nostro scenario: il matching della regular expression deve avvenire in modalità case insensitive (modificatore /i) e bisogna prevedere la presenza di un testo organizzato su più linee (modificatore /s).
L’esempio che presento è fatto in PHP utilizzando la funzione preg_replace alla quale aggiungo un riferimento.
$testo = preg_replace("/(?=[^\\>]+<)(?<=[^a-z])(?:$ricerca)/si", "\\0", $testo);