Newsgroup: it.comp.www.php
Titolo: highlight con regular expression

Ciao a tutti,
vorrei fare l'highlight di una stringa in formato html in modo tale che
risulti uguale alla sintassi di un linguaggio di programmazione.
mi spiego meglio...
se la riga nizia con *  tutta la riga deve essere verde
poi alcune parole devono essere evidenziate in blu come "select", "for",
"next"
poi,  se ho ad esempio
select miatabella //seleziono una tabella
select deve essere in blu, e dalla doppia barra deve essere verde.
e se vogliamo essere pignoli il ; mi porta a capo quindi se scrivo:
select miatabella //seleziono la ;
                            tabella
for x=1 to 100
    *riga di commento ;
        che continua a capo
    messagebox("ciao")
next
select, to, messagebox,next devono essre in blu, dopo il // fino alla fine
della parola tabella (2° riga) e la 4° e 5° riga devono essere in verde.
ho provato con questo codice:
// definisco un'array con le parole da evidenziare
 $codhighlight=array(
  1 => 'SELECT',
  2 => 'FOR',
  3 => 'NEXT',
  4 => 'TO',
  5 => 'ZAP'
  );
   $pattern="/".$codhighlight[$y]."/i";
   $rimpiazzo="<font color=\"blue\">".$codhighlight[$y]."</font>";
   $newpart=preg_replace($pattern,$rimpiazzo,$part);
ma ho qualche problema perchè mi prende anche le parole che sono in mezzo ad
altre.
ad esempio mi trasforma "commento" in "commenTO" con il TO blu :(
qualcuno mi sa aiutare ?
Grazie in anticipo
Roberto


per evitare la trasformazione di commento devi togliere la i alla seguente
riga:
da:
$pattern="/".$codhighlight[$y]."/i";
a:
$pattern="/".$codhighlight[$y]."/";
oppure utilizza:
eregi_replace()
Francesco Duca
http://www.goldenweb.it

 ha scritto nel messaggio
news:ci4flm$rpt$1...@lacerta.tiscalinet.it...


mi serve aiuto, è tutto il giorno che faccio prove senza risultati decenti
:(
ricapitolo.
ho una stringa in formato html che contiene tabelle font diversi immagini
ecc.
ho impostato anche un "tag" [CODE] e [/CODE]
il testo all'interno di questo tag deve essere analizzato e devo mettere
l'highligt in base ad alcune regole già dette nel messaggio precendente.
inoltre potrebbero esserci anche più di questi tag, quindi l'highlight deve
essere fatto solo per quelle parti di stringa in mezzo a [CODE] e [/CODE]
al momento ho creato questa funzione:
solo che non fa quello che voglio :(
mi rimpiazza i tag [CODE] correttamente, ma non riesco a fargli fare
l'highlight....
vi prego, aiutatemi....
function highlightVFPCODE($data)
{
 $initagcode="<table width=\"100%\"  border=\"0\" cellspacing=\"0\"
cellpadding=\"0\">";
 $initagcode.="<tr> <td width=\"100\">&nbsp;</td>";
 $initagcode.="<td><table width=\"100%\"  border=\"1\" cellpadding=\"0\"
cellspacing=\"0\" bordercolor=\"#CCCCCC\">";
 $initagcode.="<tr><td bgcolor=\"#B1CAD6\">&nbsp;&nbsp;&nbsp;&nbsp;<font
size=\"-1\" color=\"#FFFFFF\"><b><i>CODICE</i></b></font></td>";
 $initagcode.="</tr> <tr> <td>";
 $endtagcode=" </td></tr></table></td><td
width=\"100\">&nbsp;</td></tr></table>";
 $codhighlight=array(
  1  => 'SELECT',
  2  => 'FOR',
  3  => 'NEXT',
  4  => 'TO',
  5  => 'ZAP',
  6  => 'WAIT',
  7  => 'WINDOW',
  8  => 'SCAN',
  9  => 'ENDSCAN',
  10 => 'FROM',
  11 => 'INTO',
  12 => 'CASE',
  13 => 'DO',
  14 => 'ENDDO',
  15 => 'SKIP',
  16 => 'EXIT',
  17 => 'SYS',
  18 => 'SET',
  19 => 'FORM',
  20 => 'MENU',
  21 => 'FROM',
  22 => 'TABLE',
  23 => 'DATABASE',
  24 => 'OPEN',
  25 => 'USE',
  26 => 'IN',
  27 => 'SHARED',
  28 => 'USED'
  );
//conto i tag
 $num=substr_count($data, "[CODE]");
 for ($i=1; $i <= $num; $i++){
    /prendo la posizione e li sostituisco
  $pos_ini = strpos($data, '[CODE]');
  $data=substr_replace ($data, $initagcode, $pos_ini,6);
  $pos_ini=$pos_ini+strlen($initagcode);
  $pos_fin = strpos($data, '[/CODE]');
  $data=substr_replace ( $data, $endtagcode, $pos_fin,7);
  $pos_fin=$pos_fin-strlen($endtagcode);
  //estrgggo il pezzo di stringa
  $part=substr($data, $pos_ini, $pos_fin);
  $newpart=$part;
  //rimpiazzo il colore del font per tutti gli elementi dell'array
$codhighlight
  for ($y=1; $y<=count($codhighlight); $y++){
   //highlight
   $pattern="/".$codhighlight[$y]."/i";
   $pattern=$codhighlight[$y];
   $rimpiazzo="<b>\\0 </b>";
   $newpart=eregi_replace($pattern,$rimpiazzo,$part);
   //$pattern="[*].*";
   //$rimpiazzo="<font color=green>\\0</font>";
   //$newpart=eregi_replace($pattern,$rimpiazzo,$newpart);
  }
  $data=str_replace($part,$newpart,$data);
 }
 return $data;
}



se il codice da evidenziare č tutto maiuscolo e il resto no, puoi usare
l'espressione regolare [[:upper:]] che va a ricercare solo caratteri
maiuscoli.
es: ereg_replace("[[:upper:]]$pattern", $str_to_replace, $affected_str);
Forse potresti utilizzare un array associativo tipo $SELECT (chiave)->"<font
color=#000000>SELECT</font>" // valore
e far scorrere un ciclo in cui si sostituiscono tutte le chiavi con i
corrispettivi valori.
Appena ho un po' di tempo provo a creare qualcosa che vada bene
Francesco Duca
http://www.goldenweb.it


Ho creato questo codice che spero faccia al caso tuo (č un po' grezzo, lo
devi adattare alle tue esigenze):
<?php
$code_hilight=array(
 "SELECT"=>"<font color=blue>SELECT</font>",
 "FOR"=>"<font color=green>FOR</font>",
 "NEXT"=>"<font color=red>NEXT</font>",
 "TO"=>"<font color=yellow>TO</font>",
 "ELSE"=>"<font color=pink>ELSE</font>"
 );
$code="sdfSEleCTggsdg SELECT cdfgto TO asdsaneXTdasTodas NEXT adsElSedad
ELSE asdasaa";
echo "Vecchio codice: $code<br>\n";
while(list($key, $value)=each($code_hilight))
 {
 $code=ereg_replace($key, $value, $code);
 }
echo "Nuovo codice: $code";
?>
Francesco Duca
http://www.goldenweb.it

Per il tuo problema purtroppo non sono in grado di fornirti aiuto ma per
curiosità usi MS visual foxpro ?
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ha scritto nel messaggio
news:ci6ga7$4ih$1...@news.newsland.it...


 ha scritto nel messaggio
news:ci6a9f$us1$1...@lacerta.tiscalinet.it...


 d:\siti web\test apache\faq\inc\functions.php on line 1294
probabilmente l'errore si verifica per il motivo di cui sopra.
Francesco Duca
http://www.goldenweb.it

 ha scritto nel messaggio
news:ci6l96$cac$1...@lacerta.tiscalinet.it...



Intanto mi sembra più corretto inserire il pattern tra i doppi apici ".
se utilizzi ereg_replace, il pattern è:
"SELECT|FOR|WAIT|WINDOW|NOWAIT|NEXT|TO" e nient'altro.
solo che poi ti complichi un po' la vita se devi assegnare ad ognuno dei
valori un colore diverso.
Comunque io ti consiglio sempre lo script che ti ho inviato in precedenza
che funzione bene.
Francesco Duca
http://www.goldenweb.it