Avatar billede hoppe11 Nybegynder
20. marts 2008 - 11:55 Der er 20 kommentarer og
1 løsning

preg_match - artist+titel i m3u

jeg skal matche artist+titel i en m3u fil

#EXTINF:475,Ketto - Luxury - (Leo 18 years remix)

problemet er at hvis der er flere tilfælde af ' - ' og den skal skille artist og titel ved første

'/^#extinf:\d+,(.+) - (.+)$/i' =>
$1 = 'Ketto'
$2 = 'Luxury - (Leo 18 years remix)'

ud over det _kan_ der også være en newline i slutningen af stringen jeg matcher, den skal heller ikke med :)
Avatar billede coderdk Praktikant
20. marts 2008 - 12:07 #1
Prøv

/^#extinf:\d+,(.+?) - (.+)\r?\n?$/i
Avatar billede hoppe11 Nybegynder
20. marts 2008 - 12:17 #2
frækt :)

smid et svar
Avatar billede coderdk Praktikant
20. marts 2008 - 12:25 #3
Ok :)
Avatar billede hoppe11 Nybegynder
20. marts 2008 - 12:51 #4
hov.. nu hvor jeg tester er det den forkerte linje jeg matcher

#EXTINF linjerne bliver ikke genereret fra start i filen

det er linjen her jeg skal have fat i :)
'\Dokumenter\MP3\_NEW\Progressive house\re-reg\GREEN & HARPER - Lifetime (Original mix).mp3'
Avatar billede coderdk Praktikant
20. marts 2008 - 13:14 #5
Kan du ikke smide lidt mere indhold fra m3u'en?
Avatar billede hoppe11 Nybegynder
20. marts 2008 - 13:27 #6
jo...

her er hele filen
--------------------------
#EXTM3U
#EXTINF:454,Filterheadz - Blue sky happiness (Original mix)
\Dokumenter\MP3\_NEW\Progressive house\re-reg\FILTERHEADZ - Blue sky happiness (Original mix).mp3
#EXTINF:489,Funabashi - Daylight (Original mix)
\Dokumenter\MP3\_NEW\Progressive house\re-reg\FUNABASHI - Daylight (Original mix).mp3
#EXTINF:365,Glenn Morrison - No sudden moves (Original mix)
\Dokumenter\MP3\_NEW\Progressive house\re-reg\GLENN MORRISON - No sudden moves (Original mix).mp3
\Dokumenter\MP3\_NEW\Progressive house\re-reg\GREEN & HARPER - Lifetime (Original mix).mp3
\Dokumenter\MP3\_NEW\Progressive house\re-reg\GUY J - Been here before (Dub mix).mp3
\Dokumenter\MP3\_NEW\Progressive house\re-reg\HOLMES IVES & SOPHIE MOLETA - Awaken (Array dub mix).mp3
--------------------------------

jeg har egentlig også en "opdatering" mere til mønsteret :)

$1 = artist
$2 = titel
$3 = remix/mix (som kun er til stede i nogle tilfælde)

eks.
min artist - min titel (mit mix).mp3 =>
$1 = 'min artist'
$2 = 'min titel'
$3 = 'mit mix'

hvis der evt. står noget tekst efter mix skal det ignoreres ligesom .mp3

min artist - min titel (mit mix) noget tekst.mp3 =>
$1 = 'min artist'
$2 = 'min titel'
$3 = 'mit mix'
Avatar billede smitten1 Nybegynder
20. marts 2008 - 14:24 #7
et skud fra hoften

preg_match_all("/(?:#EXTINF:.*\r?\n)?\\\\?(?:.*?\\\\)*(.+?) - (.+?)(?: (\(.+? mix\)).*)?\..*(\r?\n|$)/", $s, $matches, PREG_SET_ORDER);

foreach($matches as $match){
    //echo $match[0]."<br>";
    echo "Artist: $match[1]<br>";
    echo "Titel: $match[2]<br>";
    echo "Mix: $match[3]<br>";
    echo "<hr>";
}
Avatar billede coderdk Praktikant
20. marts 2008 - 15:09 #8
Her er en alternativ test:

    $txt = '
#EXTM3U
#EXTINF:454,Filterheadz - Blue sky happiness (Original mix)
\Dokumenter\MP3\_NEW\Progressive house\re-reg\FILTERHEADZ - Blue sky happiness (Original mix).mp3
#EXTINF:489,Funabashi - Daylight (Original mix)
\Dokumenter\MP3\_NEW\Progressive house\re-reg\FUNABASHI - Daylight (Original mix).mp3
#EXTINF:365,Glenn Morrison - No sudden moves (Original mix)
\Dokumenter\MP3\_NEW\Progressive house\re-reg\GLENN MORRISON - No sudden moves (Original mix).mp3
\Dokumenter\MP3\_NEW\Progressive house\re-reg\GREEN & HARPER - Lifetime (Original mix) noget tekst.mp3
\Dokumenter\MP3\_NEW\Progressive house\re-reg\GUY J - Been here before.mp3
\Dokumenter\MP3\_NEW\Progressive house\re-reg\HOLMES IVES & SOPHIE MOLETA - Awaken (Array dub mix).mp3
';
    preg_match_all( "/\\\([^\\\]+?)\s*-\s*([^\\\]+?)( \((.+?)\)([^\.]+)?)?\./mi", $txt, $match, PREG_SET_ORDER );
    foreach ( $match as $m )
    {
        echo "Artist: $m[1]<br />Track: $m[2]<br />";
        if ( !empty( $m[4] ) )
        {
            echo "Mix: $m[4]<br />";
        }
        echo "<br />";
    }
Avatar billede hoppe11 Nybegynder
20. marts 2008 - 15:35 #9
coder >

jeg har ikke testet dit seneste forslag, men vil det være mere optimalt at tage hele filen på en gang fremfor en linje ad gangen?

som det sker nu kører jeg filen igennem file() og arbejder videre med array'et derfra
Avatar billede coderdk Praktikant
20. marts 2008 - 15:52 #10
bare hele filen på en gang ;)
Avatar billede hoppe11 Nybegynder
20. marts 2008 - 16:23 #11
hvad nu hvis filen ser sådan her ud? :)

#EXTM3U
#EXTINF:484,Dejonka - Memento (Ryan Davis & Lanny May's fashion lite showdown)
DEJONKA - Memento (Ryan Davis & Lanny May's fashion lite showdown).mp3
#EXTINF:526,Dousk - Street talk (Original mix)
DOUSK - Street talk (Original mix).mp3
#EXTINF:342,Dr. Analog - 6 AM (Original mix)
DR. ANALOG - 6 AM (Original mix).mp3

altså det kun er selve filen der står der uden stier
Avatar billede hoppe11 Nybegynder
20. marts 2008 - 16:24 #12
men dit seneste forslag virkede tilsyneladende som det skulle.. bare ikke hvis stien ikke var angivet

jeg synes efterhånden det er ved at være et lidt uoverskueligt mønster :)
Avatar billede coderdk Praktikant
20. marts 2008 - 16:41 #13
Prøv at lave mønsteret om til til

/(^|\\\)([^#\\\]+?)\s*-\s*([^\\\]+?)( \((.+?)\)([^\.]+)?)?\.mp3/mi

Og se om det er ok
Avatar billede hoppe11 Nybegynder
20. marts 2008 - 17:12 #14
det funker ikke helt
Avatar billede hoppe11 Nybegynder
20. marts 2008 - 17:16 #15
jeg ved godt jeg er lidt besværlig..

men stien kan også se sådan her ud :)

C:\Documents and Settings\STEPHAN BODZIN - Kerosene (Original mix).mp3

nu tror jeg vist ikke jeg har mere :p
Avatar billede hoppe11 Nybegynder
20. marts 2008 - 17:17 #16
#EXTM3U
#EXTINF:437,Stephan Bodzin - Kerosene (Original mix)
C:\Documents and Settings\STEPHAN BODZIN - Kerosene (Original mix).mp3
Avatar billede coderdk Praktikant
20. marts 2008 - 19:02 #17
Dette lader til at virke for mig:

    $txt = '
#EXTM3U
#EXTINF:454,Filterheadz - Blue sky happiness (Original mix)
\Dokumenter\MP3\_NEW\Progressive house\re-reg\FILTERHEADZ - Blue sky happiness (Original mix).mp3
#EXTINF:489,Funabashi - Daylight (Original mix)
\Dokumenter\MP3\_NEW\Progressive house\re-reg\FUNABASHI - Daylight (Original mix).mp3
#EXTINF:365,Glenn Morrison - No sudden moves (Original mix)
\Dokumenter\MP3\_NEW\Progressive house\re-reg\GLENN MORRISON - No sudden moves (Original mix).mp3
\Dokumenter\MP3\_NEW\Progressive house\re-reg\GREEN & HARPER - Lifetime (Original mix) noget tekst.mp3
\Dokumenter\MP3\_NEW\Progressive house\re-reg\GUY J - Been here before.mp3
HOLMES IVES & SOPHIE MOLETA - Awaken (Array dub mix).mp3
#EXTINF:437,Stephan Bodzin - Kerosene (Original mix)
C:\Documents and Settings\STEPHAN BODZIN - Kerosene (Original mix).mp3
';
    preg_match_all( "/(^|\\\)([^#\\\]+?)\s*-\s*([^\\\]+?)( \((.+?)\)([^\.]+)?)?\.mp3/mi", $txt, $match, PREG_SET_ORDER );
    foreach ( $match as $m )
    {
        echo "Artist: $m[2]<br />Track: $m[3]<br />";
        if ( !empty( $m[5] ) )
        {
            echo "Mix: $m[5]<br />";
        }
        echo "<br />";
    }
Avatar billede hoppe11 Nybegynder
21. marts 2008 - 14:27 #18
virker også her..

men.. :)

C:\C-JAY - Chemical illusion (Mick Wilson remix).mp3

den her returnerer "C" som artist og "JAY - Chemical illusion" som title
Avatar billede hoppe11 Nybegynder
21. marts 2008 - 14:29 #19
men det er vel bare sådan her?
/(^|\\\)([^#\\\]+?)\s+-\s+([^\\\]+?)( \((.+?)\)([^\.]+)?)?\.mp3/mi

\s* => \s+
Avatar billede coderdk Praktikant
21. marts 2008 - 14:41 #20
Korrekt, hvis du altid har mellemrum mellem kunstner, bindestreg og titel :)
Avatar billede hoppe11 Nybegynder
21. marts 2008 - 15:00 #21
du skal have tak for hjælpen

god påske :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester