<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Diego La Monica &#187; 2010 &#187; agosto</title>
	<atom:link href="http://diegolamonica.info/2010/08/feed/" rel="self" type="application/rss+xml" />
	<link>http://diegolamonica.info</link>
	<description>Software, standards, accessibilità, usabilità &#38; Web 2.0</description>
	<lastBuildDate>Wed, 28 Mar 2012 08:00:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Corso avanzato di Office e VBA</title>
		<link>http://diegolamonica.info/corso-avanzato-di-offic-e-vba/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=corso-avanzato-di-offic-e-vba</link>
		<comments>http://diegolamonica.info/corso-avanzato-di-offic-e-vba/#comments</comments>
		<pubDate>Sat, 28 Aug 2010 14:17:13 +0000</pubDate>
		<dc:creator>Diego La Monica</dc:creator>
				<category><![CDATA[Corsi e Seminari]]></category>
		<category><![CDATA[Formazione]]></category>
		<category><![CDATA[Microsoft Office]]></category>
		<category><![CDATA[VBA]]></category>

		<guid isPermaLink="false">http://diegolamonica.info/?p=256</guid>
		<description><![CDATA[Da Gennaio 2010 a Marzo 2010, sono stato incaricato dall&#8217;Agenzia per lo Sviluppo dell&#8217;Empolese Valdelsa della preparazione di un corso e la docenza. La materia di studio era l&#8217;utilizzo di VBA in Office. Per tale corso avevo preparato un bel po&#8217; di materiale, tra script, esempi e slides. A seguire vi metto le slides pubblicate già [...]]]></description>
			<content:encoded><![CDATA[<p>Da Gennaio 2010 a Marzo 2010, sono stato incaricato dall&#8217;Agenzia per lo Sviluppo dell&#8217;Empolese Valdelsa della preparazione di un corso e la docenza.</p>
<p>La materia di studio era l&#8217;utilizzo di VBA in Office.</p>
<p><span id="more-256"></span></p>
<p>Per tale corso avevo preparato un bel po&#8217; di materiale, tra script, esempi e slides.</p>
<p>A seguire vi metto le slides pubblicate già su Slideshare.</p>
<p>Chiunque fosse interessato a ricevere il materiale integrale del corso (slides e codice di esempio) alla modica cifra di 15,00 euro + spese di spedizione non esiti a contattarmi.</p>
<iframe src="http://www.slideshare.net/slideshow/embed_code/3028250" width="565" height="462" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe><br/><br/>
<iframe src="http://www.slideshare.net/slideshow/embed_code/3232681" width="565" height="462" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe><br/><br/>
<iframe src="http://www.slideshare.net/slideshow/embed_code/3232671" width="565" height="462" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe><br/><br/>
<iframe src="http://www.slideshare.net/slideshow/embed_code/3494600" width="565" height="462" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe><br/><br/>
<iframe src="http://www.slideshare.net/slideshow/embed_code/3494599" width="565" height="462" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe><br/><br/>
<iframe src="http://www.slideshare.net/slideshow/embed_code/3494598" width="565" height="462" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe><br/><br/>
<iframe src="http://www.slideshare.net/slideshow/embed_code/3572543" width="565" height="462" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe><br/><br/>
]]></content:encoded>
			<wfw:commentRss>http://diegolamonica.info/corso-avanzato-di-offic-e-vba/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Un nuovo layout, una nuova avventura</title>
		<link>http://diegolamonica.info/un-nuovo-layout-una-nuova-avventura/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=un-nuovo-layout-una-nuova-avventura</link>
		<comments>http://diegolamonica.info/un-nuovo-layout-una-nuova-avventura/#comments</comments>
		<pubDate>Fri, 27 Aug 2010 17:49:39 +0000</pubDate>
		<dc:creator>Diego La Monica</dc:creator>
				<category><![CDATA[Varie]]></category>
		<category><![CDATA[aggiornamento sito]]></category>

		<guid isPermaLink="false">http://diegolamonica.info/?p=204</guid>
		<description><![CDATA[Ciao a tutti, dopo circa 2 anni di silenzio ma di risorse costantemente disponibili, ho deciso di fare un piccolo restyling del sito. Il vecchio sito è sempre disponibile (per gli amanti del retrò style :-) ) all&#8217;url http://old.diegolamonica.info. Al momento sto ultimando la migrazione tutti i contenuti e sto ottimizzando l&#8217;installazione di WordPress. Quindi, mentre vi [...]]]></description>
			<content:encoded><![CDATA[<p>Ciao a tutti, dopo circa 2 anni di silenzio ma di risorse costantemente disponibili, ho deciso di fare un piccolo restyling del sito.</p>
<p>Il vecchio sito è sempre disponibile (per gli amanti del retrò style :-) ) all&#8217;url <a href="http://old.diegolamonica.info">http://old.diegolamonica.info</a>.</p>
<p>Al momento sto ultimando la migrazione tutti i contenuti e sto ottimizzando l&#8217;installazione di WordPress.</p>
<p>Quindi, mentre vi preoccuperete di navigare i contenuti di questo blog, n0n arrabbiatevi troppo (almeno per ora) se vi compaiono errori di tanto in tanto ;)</p>
<p>Per ora non ho pianificato ancora la migrazione di una serie di servizi che prima avevo reso disponibili sul sito (Newsletter e NoPaste), nel tempo reintegrerò di nuovo queste funzionalità per garantirvi sempre il meglio.</p>
<p>Grazie e mi auguro che sia di vostro gradimento il nuovo layout!</p>
]]></content:encoded>
			<wfw:commentRss>http://diegolamonica.info/un-nuovo-layout-una-nuova-avventura/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Funzione Replace in Microsoft Visual Basic 5</title>
		<link>http://diegolamonica.info/funzione-replace-in-microsoft-visual-basic-5/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=funzione-replace-in-microsoft-visual-basic-5</link>
		<comments>http://diegolamonica.info/funzione-replace-in-microsoft-visual-basic-5/#comments</comments>
		<pubDate>Fri, 27 Aug 2010 09:59:26 +0000</pubDate>
		<dc:creator>Diego La Monica</dc:creator>
				<category><![CDATA[Knowledge Base]]></category>
		<category><![CDATA[Manipolazione delle stringhe]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[Microsoft Visual Basic]]></category>
		<category><![CDATA[Retrocompatibilità]]></category>
		<category><![CDATA[Sviluppo lato Client]]></category>

		<guid isPermaLink="false">http://diegolamonica.info/?page_id=84</guid>
		<description><![CDATA[Sin dalla versione 6 del Visual Basic è stata introdotta la funzione Replace che consente di sostituire una parte di una stringa con una nuova stringa. Questa però è una funzionalità che gli sviluppatori che utilizzano Visual Basic 5 (o una versione precedente) non possono utilizzare se non implementando tale funzione da zero. L&#8217;esigenza mi [...]]]></description>
			<content:encoded><![CDATA[<p>Sin dalla versione 6 del Visual Basic è stata introdotta la funzione Replace che consente di sostituire una parte di una stringa con una nuova stringa. Questa però è una funzionalità che gli sviluppatori che utilizzano Visual Basic 5 (o una versione precedente) non possono utilizzare se non implementando tale funzione da zero. L&#8217;esigenza mi è nata dal momento in cui avevo da manutenere dei vecchi progetti di alcuni clienti che richiedevano l&#8217;uso di tale versione.<span id="more-84"></span></p>
<p>Di seguito è rappresentata la funzione <strong>Replace </strong>da copiare ed incollare in un Modulo ed utilizzabile da Visual Basic 5 quanto dalle versioni precedenti.<br />
Tale funzione utilizza la stessa sintassi della funzione introdotta con il Visual Basic 6 così da consentire eventuali migrazioni delle procedure che ne fanno utilizzo in modo trasparente (rimuovendo quindi solo la funzione dal modulo).</p>
<pre name="code" class="vb">Public Function Replace(ByVal Expression As String, Find As String, sReplace As String, Optional Start As Long = 1) As String
  Dim S As String
  Dim I As Integer
  For I = Start To Len(Expression)
    S = UCase(Mid(Expression, I, Len(Find)))
    If S = UCase(Find) Then
       Expression = Left(Expression, I - 1) &amp; sReplace &amp; _
          Mid(Expression, I + Len(Find))
       I = I + Len(sReplace) - 1
    End If
  Next
  Replace = Expression
End Function</pre>
]]></content:encoded>
			<wfw:commentRss>http://diegolamonica.info/funzione-replace-in-microsoft-visual-basic-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spostare un file nel cestino di Windows</title>
		<link>http://diegolamonica.info/spostare-un-file-nel-cestino-di-windows/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=spostare-un-file-nel-cestino-di-windows</link>
		<comments>http://diegolamonica.info/spostare-un-file-nel-cestino-di-windows/#comments</comments>
		<pubDate>Fri, 27 Aug 2010 09:23:44 +0000</pubDate>
		<dc:creator>Diego La Monica</dc:creator>
				<category><![CDATA[File System]]></category>
		<category><![CDATA[Knowledge Base]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[Cestino]]></category>
		<category><![CDATA[Microsoft Visual Basic]]></category>
		<category><![CDATA[Sviluppo lato Client]]></category>

		<guid isPermaLink="false">http://diegolamonica.info/?page_id=81</guid>
		<description><![CDATA[Tempo addietro, durante lo sviluppo di una procedura lato server, mi capitò di dover gestire l&#8217;eliminazione di alcuni files, ovviamente la prima cosa che feci fu pensare di cancellare direttamente il file&#8230; Ma dopo diverso tempo il cliente mi chiese di modificare tale procedura in modo da non cancellare definitivamente i files ma di spostarli [...]]]></description>
			<content:encoded><![CDATA[<p>Tempo addietro, durante lo sviluppo di una procedura lato server, mi capitò di dover gestire l&#8217;eliminazione di alcuni files, ovviamente la prima cosa che feci fu pensare di cancellare direttamente il file&#8230; Ma dopo diverso tempo il cliente mi chiese di modificare tale procedura in modo da non cancellare definitivamente i files ma di spostarli nel cestino ed avrebbe cestinato lui (in un secondo tempo) quelli che riteneva non più necessari.<span id="more-81"></span></p>
<p>L&#8217;algoritmo che dovetti implementare per cancellare ciascun file fa uso di una API di Windows ed il codice è simile a quello che segue:</p>
<pre name="code" class="vb">Private Type SHFILEOPSTRUCT
 hWnd As Long
 wFunc As Long
 pFrom As String
 pTo As String
 fFlags As Integer
 fAborted As Boolean
 hNameMaps As Long
 sProgress As String
End Type
Private Const FO_DELETE = &amp;H3
Private Const FOF_ALLOWUNDO = &amp;H40
Private Declare Function SHFileOperation Lib "shell32.dll" Alias
  "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long

Public Function SpostaNelCestino(file_name As String)
  Dim SHFileOp As SHFILEOPSTRUCT
  With SHFileOp
   .wFunc = FO_DELETE
   .pFrom = file_name
   .fFlags = FOF_ALLOWUNDO
  End With
  SHFileOperation SHFileOp
End Sub</pre>
]]></content:encoded>
			<wfw:commentRss>http://diegolamonica.info/spostare-un-file-nel-cestino-di-windows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Generare un unico file da più files</title>
		<link>http://diegolamonica.info/generare-un-unico-file-da-piu-files/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=generare-un-unico-file-da-piu-files</link>
		<comments>http://diegolamonica.info/generare-un-unico-file-da-piu-files/#comments</comments>
		<pubDate>Fri, 27 Aug 2010 09:21:00 +0000</pubDate>
		<dc:creator>Diego La Monica</dc:creator>
				<category><![CDATA[File System]]></category>
		<category><![CDATA[Knowledge Base]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[Accesso ai files]]></category>
		<category><![CDATA[Microsoft Visual Basic]]></category>

		<guid isPermaLink="false">http://diegolamonica.info/?page_id=79</guid>
		<description><![CDATA[Tempo addietro mi capitò di dover suddividere una serie di files particolarmente grandi su una serie di dischetti avendo un cliente un PC &#8220;leggermente&#8221; obsoleto (Microsoft Windows 95). Il problema era successivamente dover ricongiungere questi files in un unico grande file. Rimarcando la mia fama tra gli amici per non riutilizzare mai software impacchettato e [...]]]></description>
			<content:encoded><![CDATA[<p>Tempo addietro mi capitò di dover suddividere una serie di files particolarmente grandi su una serie di dischetti avendo un cliente un <dfn title="Personal Computer">PC</dfn> &#8220;leggermente&#8221; obsoleto (Microsoft Windows 95). Il problema era successivamente dover ricongiungere questi files in un unico grande file.</p>
<p>Rimarcando la mia fama tra gli amici per non riutilizzare mai software impacchettato e freeware, ma sempre propenso a sviluppare internamente quella specifica funzione ad-hoc, decisi di svilupparmi una procedura per lo splitting del file in una serie di n files di una determinata dimensione ed ovviamente sviluppai anche la funzione per la ricongiunzione dei files in un unico grande file.</p>
<p><span id="more-79"></span>Il frammento di codice che trovate di seguito, è estratto da un progetto leggermente più grosso ed ho preferito riportare semplicemente l&#8217;essenziale per comprendere come funziona il tutto:</p>
<pre>Dest = FreeFile
 MergedFile = "C:\Merged.txt"
 Offset = 1
 Open MergedFile for Binary Access Write Lock Read As FDest
 For I=Lbound(filesArray) to UBound(filesArray)
 FSorg = FreeFile
 Open filesArray(I) for binary Access Read Lock Write as FSorg
 S=String(Lof(FSorg),chr(0))
 Get FSorg,1,S
 Close FSorg
 Put FDest,Offset, S
 Offset = Offset + len(S)
 next
 Close FDest</pre>
<p><em>Questa procedura preleva da un array<strong> filesArray</strong> i nomi dei files da concatenare e li salva in un unico file indicato nella variabile <strong>MergedFile</strong></em></p>
]]></content:encoded>
			<wfw:commentRss>http://diegolamonica.info/generare-un-unico-file-da-piu-files/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Come determinare se una cartella è condivisa</title>
		<link>http://diegolamonica.info/come-determinare-se-una-cartella-e-condivisa/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=come-determinare-se-una-cartella-e-condivisa</link>
		<comments>http://diegolamonica.info/come-determinare-se-una-cartella-e-condivisa/#comments</comments>
		<pubDate>Fri, 27 Aug 2010 09:17:42 +0000</pubDate>
		<dc:creator>Diego La Monica</dc:creator>
				<category><![CDATA[Knowledge Base]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[Client Server]]></category>
		<category><![CDATA[Condivisioni]]></category>
		<category><![CDATA[Microsoft Visual Basic]]></category>
		<category><![CDATA[Sviluppo lato Client]]></category>

		<guid isPermaLink="false">http://diegolamonica.info/?page_id=76</guid>
		<description><![CDATA[Talvolta quando si creano degli applicativi che devono lavorare in background senza l&#8217;intervento dell&#8217;utente, è bene prevedere qualsiasi anomalia senza però segnalare con un alert (magari su un server) la situazione anomala e comunque senza mandare in crash l&#8217;intera applicazione per una condizione non verificatasi. Tempo addietro mi capitò sviluppando una procedura batch che un [...]]]></description>
			<content:encoded><![CDATA[<p>Talvolta quando si creano degli applicativi che devono lavorare in background senza l&#8217;intervento dell&#8217;utente, è bene prevedere qualsiasi anomalia senza però segnalare con un alert (magari su un server) la situazione anomala e comunque senza mandare in crash l&#8217;intera applicazione per una condizione non verificatasi.</p>
<p>Tempo addietro mi capitò sviluppando una procedura batch che un sistema generava dei files e che questi dovevano essere trasferiti in una cartella condivisa sul server per cui mi serviva un metodo per capire se effettivamente tale cartella era condivisa o meno.<span id="more-76"></span></p>
<p>Il codice che segue mi ha aiutato nella risoluzione del problema:</p>
<pre>Type SHFILEINFO
 hIcon As Long
 iIcon As Long
 dwAttributes As Long
 szDisplayName As String * MAX_PATH
 szTypeName As String * 80
End Type

Public Const SHGFI_ATTRIBUTES = &amp;H800
Public Const SFGAO_SHARE = &amp;H20000
Public Declare Function SHGetFileInfo Lib  "shell32.<dfn title="Dynamic Linked Library">dll</dfn>" Alias "SHGetFileInfoA" _
 (ByVal pszPath As String, ByVal swFileAttributes As Long, _
 psfi As SHFILEINFO, ByVal cbFileInfo As Long, ByVal uFlags As Long) As Long

Public Function IsSharedThisFolder(ByVal Path As String) As Boolean
 Dim sfi As SHFILEINFO

 SHGetFileInfo Path, 0, sfi, Len(sfi), SHGFI_ATTRIBUTES
 IsSharedThisFolder=(sfi.dwAttributes And SFGAO_SHARE)
End Function</pre>
]]></content:encoded>
			<wfw:commentRss>http://diegolamonica.info/come-determinare-se-una-cartella-e-condivisa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Come eseguire il download di un file da Internet</title>
		<link>http://diegolamonica.info/71-2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=71-2</link>
		<comments>http://diegolamonica.info/71-2/#comments</comments>
		<pubDate>Fri, 27 Aug 2010 09:13:29 +0000</pubDate>
		<dc:creator>Diego La Monica</dc:creator>
				<category><![CDATA[Knowledge Base]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Microsoft Visual Basic]]></category>
		<category><![CDATA[Sviluppo lato Client]]></category>

		<guid isPermaLink="false">http://diegolamonica.info/?page_id=71</guid>
		<description><![CDATA[Diverso tempo fa mi trovai a dover affrontare il problema dell&#8217;aggiornamento di un applicazione via internet costituita da una serie di files e visto che non volevo che i miei clienti si scomodassero a scaricare corposi messaggi di posta elettronica (causandogli magari la saturazione della casella) e comunque volevo evitare che il personale potesse fare [...]]]></description>
			<content:encoded><![CDATA[<p>Diverso tempo fa mi trovai a dover affrontare il problema dell&#8217;aggiornamento di un applicazione via internet costituita da una serie di files e visto che non volevo che i miei clienti si scomodassero a scaricare corposi messaggi di posta elettronica (causandogli magari la saturazione della casella) e comunque volevo evitare che il personale potesse fare dei &#8220;copia &amp; incolla&#8221; sbagliati e fondamentalmente non volevo ritrovarmi ore ed ore al telefono per dire&#8230; vai su&#8230; copia il file&#8230; incollalo in&#8230; sposta questo&#8230; insomma ci siamo capiti! <img src="http://old.diegolamonica.info/images/smiles/smile.gif" alt=":)" /></p>
<p><span id="more-71"></span>Per ovviare a quanto previsto ho cercato un po&#8217; in giro su internet una serie di possibili soluzioni e trovandone una l&#8217;ho poi adattata alle mie esigenze.</p>
<p>Di seguito c&#8217;è un estratto di codice sviluppato con Microsoft Visual Basic 6.0 adattato genericamente a scaricare l&#8217;immagine <a title="Apri l'immagine di esempio" href="http://www.diegolamonica.info/images/diegolamonica.jpg">http://www.diegolamonica.info/images/diegolamonica.jpg</a> da questo sito e collocarla nella root del disco rigido.</p>
<pre>Private Declare Function URLDownloadToFile Lib "urlmon" Alias _
 "URLDownloadToFileA" (ByVal pCaller As Long, _
 ByVal szURL As String, _
 ByVal szFileName As String, _
 ByVal dwReserved As Long, _
 ByVal lpfnCB As Long) As Long
 Public Function DownloadFile(URL As String, _
 LocalFilename As String) As Boolean

 Dim lngRetVal As Long

 lngRetVal = URLDownloadToFile(0, URL, LocalFilename, 0, 0)

 If lngRetVal = 0 Then DownloadFile = True
 End Function

 Private Sub Form_Load()

 ' Sostituire il primo parametro con il file che si vuole scaricare
 ' ed il secondo argomento con il nome del file locale nel quale vuoi salvarlo.

 ret = DownloadFile("http://diegolamonica.info/images/diegolamonica.jpg", "c:\logo_diego.jpg")
 End Sub</pre>
]]></content:encoded>
			<wfw:commentRss>http://diegolamonica.info/71-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Evidenziare il testo di una pagina web</title>
		<link>http://diegolamonica.info/evidenziare-il-testo-di-una-pagina-web/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=evidenziare-il-testo-di-una-pagina-web</link>
		<comments>http://diegolamonica.info/evidenziare-il-testo-di-una-pagina-web/#comments</comments>
		<pubDate>Fri, 27 Aug 2010 09:03:21 +0000</pubDate>
		<dc:creator>Diego La Monica</dc:creator>
				<category><![CDATA[Espressioni Regolari]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://diegolamonica.info/?page_id=67</guid>
		<description><![CDATA[Molto spesso mi sono imbattuto in risultati di ricerca sul web dove la pagina web restituita era evidenziata nelle parti attinenti al testo ricercato&#8230; &#8220;molto interessante!&#8221; mi sono sempre detto&#8230; 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 [...]]]></description>
			<content:encoded><![CDATA[<p>Molto spesso mi sono imbattuto in risultati di ricerca sul web dove la pagina web restituita era evidenziata nelle parti attinenti al testo ricercato&#8230; &#8220;molto interessante!&#8221; mi sono sempre detto&#8230; 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&#8230; in pratica con una sola riga di codice mi è stato possibile fare il tutto.</p>
<p>Come?</p>
<p><span id="more-67"></span></p>
<p>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&#8217;interno di un testo, per esempio, la parola <dfn title="Centro Elaborazione Dati">CED</dfn> (così come avviene su questo sito) è:</p>
<pre>(?=[^\&gt;]+&lt;)(?=[^a-z])(?:<dfn title="Centro Elaborazione Dati">CED</dfn>)</pre>
<p>Cosa fà? Semplice a descriverlo non tanto semplice nel comprendere quale illuminazione assurda ha folgorato la mia mente! <img src="http://old.diegolamonica.info/images/smiles/smile.gif" alt=":)" /></p>
<p>In pratica l&#8217;analisi dell&#8217;espressione è indicata nell&#8217;elenco puntato che segue:</p>
<ul>
<li>Estrai il termine <dfn title="Centro Elaborazione Dati">CED</dfn> (nell&#8217;espressione: <strong>(?:<dfn title="Centro Elaborazione Dati">CED</dfn>)</strong> ) che si trova in un contesto in cui:
<ul>
<li>Prima del termine non ci sia alcun carattere compreso tra a e z (nell&#8217;espressione: <strong>(?=[^a-z])</strong> )</li>
<li>Che non sia il valore di un attributo o l&#8217;attributo stesso di un tag (nell&#8217;espressione <strong>(?=[^\&gt;]+&lt;)</strong> ).</li>
</ul>
</li>
</ul>
<p>Ovviamente poi bisonga formattarlo ed utilizzare le funzioni più appropriate in base al linguaggio di programmazione che viene utilizzato.</p>
<p>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 <strong>/i</strong>) e bisogna prevedere la presenza di un testo organizzato su più linee (modificatore <strong>/s</strong>).</p>
<p>L&#8217;esempio che presento è fatto in <dfn title="Hypertext Preprocessor">PHP</dfn> utilizzando la funzione preg_replace alla quale aggiungo un riferimento.</p>
<pre> $testo = preg_replace("/(?=[^\\&gt;]+&lt;)(?&lt;=[^a-z])(?:$ricerca)/si", "\\0", $testo);</pre>
]]></content:encoded>
			<wfw:commentRss>http://diegolamonica.info/evidenziare-il-testo-di-una-pagina-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

