Newsgroup: it.comp.www.php
Titolo: Filtrare una stringa.

Ciao, avrei bisogno di qualche esperto di regexp che mi dia una mano a 
risolvere questo problemino, vi sintetizzo brevemente la situazione, ho 
un file cosi composto :
a2ps-4.13b-37.i386.rpm
aalib-1.4.0-0.fdr.0.8.rc5.2.i386.rpm
acl-2.2.7-5.i386.rpm
acpid-1.0.2-6.i386.rpm
alchemist-1.0.33-1.i386.rpm
alsa-lib-1.0.3a-2.i386.rpm
alsa-utils-1.0.3-1.i386.rpm
anacron-2.3-30.i386.rpm
apmd-3.0.2-22.i386.rpm
apt-0.5.15cnc6-0.fdr.11.2.i686.rpm
....
....
ecc.ecc..
Tramite uno script, vorrei tagliare da tutte le stringe sia l'estensione 
che il numero di versione, avendo in output quindi :
a2ps
aalib
acl
acpid
alchemist
alsa-lib
alsa-utils
anacron
apmd
apt
....
Ho fatto diversi tentativi, ho tolto l'estensione e tutto dopo il 
carattere - , mi sono accorto poi che si dovrebbe fare un controllo a 
quanti caratteri - , ci sono dato che ad esempio nel caso di alsa-lib o 
alsa-utils , la stringa mi veniva spezzata erroneamente.
Come posso fare ??
Vi ringrazio in anticipo! :D

 fatto non succede nulla

 ha scritto nel messaggio
news:co294j$mo8$1...@le1.cs.unibo.it...

sto indovinando, non ho provato
if (preg_match('/([a-z0-9-]+)-[0-9]/iU',$str,$m))
    echo $m[1]."\n";
else
    echo 'boh?: '.$str."\n";

 
Non mi stampa nulla, solo i boh?: , purtroppo di espressioni regolari 
non me ne intendo affatto, qualcuno puo darmi una mano ??
Grazie.

 ha scritto:

non so cosa diavolo hai provato (forse solo quel frammento, oppure
sta m**** di ereg?).
Cmq. questo va (modificato anche il regexp, ma quello di prima andava):
<?php
$packs=array(
"a2ps-4.13b-37.i386.rpm",
"aalib-1.4.0-0.fdr.0.8.rc5.2.i386.rpm",
"acl-2.2.7-5.i386.rpm",
"acpid-1.0.2-6.i386.rpm",
"alchemist-1.0.33-1.i386.rpm",
"alsa-lib-1.0.3a-2.i386.rpm",
"alsa-utils-1.0.3-1.i386.rpm",
"anacron-2.3-30.i386.rpm",
"apmd-3.0.2-22.i386.rpm",
"apt-0.5.15cnc6-0.fdr.11.2.i686.rpm"
);
foreach($packs as $rpm)
{
 if (preg_match('/^([a-z0-9-]+)-[0-9]/iU',$rpm,$m))
     echo $m[1]."\n";
 else
     echo 'boh?: '.$str."\n";
}
?>

      echo 'boh?: '.$str."\n";
ovviamente:
       echo 'boh?: '.$rpm."\n";

Lo scipt ora va bene, ma mi sono accorto proprio ora di un errore:
Quando una stringa è cosi :
xorg-x11-100dpi-fonts-6.7.0-9.i686.rpm
Taglia da 100Dpi in poi, diventa quindi :
xorg-x11
Ma come fargli capire che 100dpi non è il numero di versione ?
Ciao e grazie!

Paolo Mainardi wrote:

prova con..
preg_match('/^([a-z0-9-]+)-[0-9]*\./iU',$rpm,$m);
-- 
www.iuz-lab.info

Innanzitutto grazie a tutti per l'aiuto, la situazione dopo l'aiut di 
iuz sembra essersi risolta, da solo un altro piccolo errore quando 
incontra stringhe cosi:
tcp_wrappers-7.6-36.i386.rpm
boh?: tcp_wrappers-7.6-36.i386.rpm
cioè con l'underscore, non sa filtrarla.
Mi aiutate ? Grazie!!


Paolo Mainardi ha scritto:

Spero di non scrivere una cavola integro l'aiuto di iuz:
preg_match('/^([a-z0-9-]+)(\-|_)[0-9]*\./iU',$rpm,$m);

Purtroppo da lo stesso errore, e ne ho visto anche un altro:
openoffice.org-libs-1.1.2-3.1.2.kde.i386.rpm
boh?: openoffice.org-libs-1.1.2-3.1.2.kde.i386.rpm
Non gli piacciono ne gli underscore ne i punti!


 
prova..
if(preg_match('/^([a-z0-9-\._]+)-[0-9]*\./iU',$rpm,$m))
-- 
www.iuz-lab.info

Grazie grazie grazie!! :D
Ancora unico e ultimo problema, perdonami se non te li ho segnalati 
tutti subito.
ncurses-c++-devel-5.4-5.i386.rpm
boh?: ncurses-c++-devel-5.4-5.i386.rpm


 > if(preg_match('/^([a-z0-9-\._]+)-[0-9]*\./iU',$rpm,$m))
Quasi quasi proverei quello:
'/^(.+)-[0-9]+\./U'


Perfetto! Funziona, grazie a tutti per l'aiuto! ;)