Regular Expression per imageMap

Nel progetto a qui stò lavorando mi è sorta la necessità di estrapolarmi da un XML delle mappe di immagini per convertirli in oggetti (HotSpots) da applicare alla mia ImageMap.
Per aiutarmi in questa operazione mi sono venute in soccorso le regular expression.
E'la prima volta che ne applico una, e devo ammettere che non è stato facile costruirla, ma il risultato ha ricompensato le fatiche.

Ecco il file xml di partenza

<productsImage>
<record>
  <image>
immagine.gif</image> 
  <image_path>
images/immagine.gif</image_path>
<product_search_category_map>
<![CDATA[ 
<MAP 
NAME="NAMEABC">

<
AREA SHAPE=POLY COORDS="55,150,56,164,65,164,70,158,143,158,149,188,161,189,174,182,167,150,170,145,180,142,187,143,209,131,232,129,248,132,257,137,220,195,221,203,231,206,278,151,275,143,268,131,281,118,247,104,205,103,195,109,191,115,137,126,141,152,68,153,69,146,55,146,55,150" HREF="productsView.asp?product_id=product1" ALT="descrizione 1">

<AREA SHAPE=POLY COORDS="759,159,759,168,749,169,748,164,643,164,643,170,630,181,604,156,619,149,621,144,637,158,744,158,752,154,760,155,759,161,759,159" HREF="productsView.asp?product_id=product2" ALT="descrizione 2">

<AREA SHAPE=CIRCLE COORDS="60,73,16" HREF="productsView.asp?product_id=product3" ALT="descrizione 3">
<
/MAP>

  
]]> 
  
</product_search_category_map>
  <
/record>
  <
/productsImage>

E dopo parecchie prove, ecco la regular expression che mi convertirà il campo product_search_category_map

<AREA(\s+(?<name>SHAPE|COORDS|ALT|HREF)=("(?<value>[^"]*)"|(?<value>[^\s>]+)))*\s*> 

Ma il difficile per me, da neofita delle regex, è stato anche l'applicarla e il capire dove finivano i campi che mi estrapolava, ma alla fine ce l'ho fatta ed ecco qui il codice di trasformazione da un stringa in input(il campo product_search_category_map) in un oggetto chiamato Area (con le proprietà SHAPE, COORDS, ALT e HREF):

public object Transform(string input)
{
   List<Area> areas = 
new 
List<Area>();
   
foreach (Match match in Regex.Matches((string
)input, @"<AREA(\s+(?<name>SHAPE|COORDS|ALT|HREF)=(""(?<value>[^""]*)""|(?<value>[^\s>]+)))*\s*>"))
         areas.Add(CreateArea(match.Groups));
   
return 
areas;
}

private 
Area CreateArea(GroupCollection groupCollection)
{
   Area area = 
new 
Area();

   
for (int 
i = 0; i < groupCollection["name"].Captures.Count; i++)
   {
      
string 
name = groupCollection["name"].Captures[i].Value;
      
string value 
= groupCollection["value"].Captures[i].Value;

      
switch 
(name.ToLower())
      {
          
case 
"shape":
             area.Shape = 
value
;
             
break
;
          
case 
"coords":
             area.Coords = 
value
;
             
break
;
          
case 
"alt":
             area.Alt = 
value
;
             
break
;
          
case 
"href":
             area.Href = 
value
;
             
break
;
      }
  }
   
return 
area;
}

Risultato della giornata: credo che approfondirò la conoscenza delle regular expression e inizierò ad usarle più spesso. La difficoltà iniziale non è stata poca, ma ci sono strumenti che ci possono dare una mano, come ad esempio The Regulator che mi ha permesso di testare a mano a mano la la regular expression durante la sua creazione.

Print | posted on martedì 23 maggio 2006 18:23