webForumDet fria alternativet

Extrahera youtube-ids 11 tecken

ASP

36 svar · 1 831 visningar · startad av brorsan · sida 2 av 2

Frågan, av brorsan

Hejsan, jag skulle behöva ha en enkel kod som när någon infogar en länk till sitt youtubeklipp då plockar ut de 11 tecken som är youtubeklippets unika id oavsett i vilken form koden är inklistrad. Typ: if adress = <http://www.youtube.com/watch?v=4NGBVAeHeg> then make address 4NGBVAeHeg else if adress = <http://www.youtube.com/watch?v=4NGBVAeHeg&feature=related> then make address 4NGBVAeH

Läs frågan i sin helhet →
Medlem sedan nov. 2001402 inlägg
#21

Hela det här är för övrigt bara för att jag inte hade en aning om vad de olika var för något så jag försökte skriva ut dem för att förhoppningsvis kunna fatta processen.

 response.write youtubeid 
response.write "youtubeid"
response.write match0 
response.write "match0"
response.write match0(7)
response.write "match0(7)"
response.write adress
response.write "adress"
Medlem sedan nov. 2001402 inlägg
#22

När du först kör regex-anropet får du tillbaka en lista med matchningar för hela uttrycket. Din sträng kan t ex innehålla flera YouTube-länkar, och då är varje sådan länk en matchning för sig. Nästa steg är i sin tur att plocka ut undermatchningar inom uttrycket. Varje parentes skapar en ny undermatchning, något man förövrigt kan använda för att plocka ut flera saker med ett anrop. I detta fall råkar uttrycket innehålla mycket parenteser och själva ID't hamnar på plats 7.

Ok, tror att jag förstår efter att ha läst 5-6 gånger :)

Medlem sedan juni 20019 519 inlägg
#23

Du vill oavsett vad som står i strängen bara hämta ut youtube ID:et?

Medlem sedan nov. 2001402 inlägg
#24

Du vill oavsett vad som står i strängen bara hämta ut youtube ID:et?

Precis. och om det upprepas två gånger i strängen som i embedkoden så bör det bara komma med en gång.

Medlem sedan juni 20019 519 inlägg
#25

http://voigt.se/sandbox/wf/brorsan/

koden:

<%
Function GetYoutubeId(str)
    Dim myRegExp, myMatches, myMatch
    Set myRegExp = New RegExp
    myRegExp.MultiLine = True
    myRegExp.Pattern = "(?:youtu\.be/|v/|/u/\w/|embed/|watch\?)(?:\??v?=?)([^#&? ]*)"
    Set myMatches = myRegExp.Execute(str)
    If myMatches.Count >= 1 Then
        Set myMatch = myMatches(0)
        GetYoutubeId = myMatch.SubMatches(0)
    Else
        GetYoutubeId = ""
    End If

    Set myRegExp = Nothing
End Function

Dim m
m = "testar och se om [url]http://www.youtube.com/watch?v=hQVTIJBZook[/url] fungera"
Response.Write m
Response.Write "<hr>"
Response.Write GetYoutubeId(m)
%>

något sånt?

Medlem sedan aug. 20039 340 inlägg
#26

För övrigt, när jag tänker närmare på saken bör [^#&? ]* ersättas med [a-zA-Z0-9_-]{11}
Då matchar man precis vad som bör finnas i ett YT-id och undviker eventuella HTML-injektionsattacker som kan förekomma. Sen vet jag inte vilken konvention ASP använder för matchning av bindestreck teckengrupper. Eventuellt bör bindestrecket placeras först i gruppen.

Medlem sedan juni 20019 519 inlägg
#27

och [a-zA-Z0-9_-] kan vara [\w-] i ASP

Medlem sedan nov. 2001402 inlägg
#28

Tusen tack voigtann1! fungerar finfint även hos mig, ska se om jag får till det i sitt sammanang nu också.

nitro2k01, ska prova om det fungerar när jag ersätter med det, tack för det och för din del i koden!

Medlem sedan nov. 2001402 inlägg
#29

och [a-zA-Z0-9_-] kan vara [\w-] i ASP

Detta förstod jag inte, kan du för säkerhets skull tänka dig att klistra in den kompletta koden med nitros säkerhetsbyte mot injektioner? :)

Medlem sedan juni 20019 519 inlägg
#30
myRegExp.Pattern = "(?:youtu\.be/|v/|/u/\w/|embed/|watch\?)(?:\??v?=?)([\w-]{11})"
Medlem sedan nov. 2001402 inlägg
#31

Sweet!

Medlem sedan aug. 20039 340 inlägg
#32

brorsan skrev:

Detta förstod jag inte, kan du för säkerhets skull tänka dig att klistra in den kompletta koden med nitros säkerhetsbyte mot injektioner? :)

Förklaring: [abc] matchar en teckengrupp, dvs ett exemplar av ett av de tecken som räknas upp. I fallet [abc] så tillåts matchning av tecknen a, b eller c. För att göra livet enklare så finns det genvägar att matcha en större grupp tecken. En sådan genväg är bindestrecket, som kan användas för att matcha ett omfång av tecken. [a-z] betyder "liten bokstav mellan a och z". Vad A-Z0-9 betyder kan du nog räkna ut. Sedan på slutet ett ensamt _ och - måste placeras allra sist för att inte tolkas som det specialtecken det annars är. (Annars skulle det kunna tolkas som "från _ till (något annat tecken)" i likhet med a-z och så.)
[a-zA-Z0-9_-] matchar alltså ett exemplar av de tecken som är giltig i ett YT-id.

En annan form av genväg är \w om betyder "ordtecken" ("word character"). Till dessa räknas stora och små enegelska bokstäver (a-z), nuffror (0-9) samt understreck (_). Dock inte bindestrecket, så det måste fortfarande läggas till sist för att uttrycket ska matcha rätt. Alltså matchar även [\w-] ett exemplar av ett tecken tillåtet i ett YT-id.

Och som jag har påpekat matchar uttrycken ovan enbart ett tecken. Det är där {11} kommer in. {11} matchar föregående tecken precis elva gånger. a{4} skulle exempelvis exakt matcha strängen aaaa. Och [\w-]{11} matchar som sagt exakt de 11 tecknen som kan finnas i ett giltigt YT-id.

Medlem sedan nov. 2001402 inlägg
#33

Tack nitro2k01, jättetydlig förklaring, då är jag med. :) 11:an hade jag i alla fall räknat ut.

Ska klura på en påbyggnad så har lite frågor:

Är backslash i youtu\.be för att punkten inte ska misstolkas som programmeringspunkt?

Är det i så fall amma sak med frågetecknet mellan v och = eller?

Varför delar man av med backslash på ena och frågetecken på den andra, har varje specialtecken ett eget tecken för att visa att det inte är "programmeringstecken"?

Medlem sedan nov. 2001402 inlägg
#34

Nu la jag till detta så att även vimeo fungerar, kan ju dela här om någon kommer på samma tanke i framtiden:

    
myRegExp.Pattern = "(?:youtu\.be/|v/|/u/\w/|/embed/|watch\?)(?:\??v?=?)([\w-]{11})"
myRegExp.Pattern = "(?:vimeo\.com/?)([\w-]{8})"
Medlem sedan nov. 2001402 inlägg
#35

Det fungerade visst inte när de låg direkt efter varandra men så här gick det.

Function GetYoutubeId(str)
    Dim myRegExp, myMatches, myMatch
    Set myRegExp = New RegExp
    myRegExp.MultiLine = True
    myRegExp.Pattern = "(?:youtu\.be/|v/|/u/\w/|/embed/|watch\?)(?:\??v?=?)([\w-]{11})"
    Set myMatches = myRegExp.Execute(str)  
    If myMatches.Count >= 1 Then
        Set myMatch = myMatches(0)
        GetYoutubeId = myMatch.SubMatches(0)
    Else
        myRegExp.Pattern = "(?:vimeo\.com/?)([\w-]{8})"
        Set myMatches = myRegExp.Execute(str) 
    end if 
    If myMatches.Count >= 1 Then
    Set myMatch = myMatches(0)
        GetYoutubeId = myMatch.SubMatches(0)
    Else
        GetYoutubeId = ""
    End If

    Set myRegExp = Nothing
End Function
Medlem sedan juni 20019 519 inlägg
#36

\. är att du vill träffa en sträng punkt, medans . betyder träffar på vilket tecken som helst utom \n (samma sak som [^\n])

v/ betyder som det står måste vara v och /

(?:\??v?=?)

betyder att vi vill gruppera träffen, men inte skapa en referens **(?:****)**delen
\? betyder träffar "?" men ? direkt efter den betyder att den få träffas max en gång, eller ingen (samma sak som {0,1})

Jag hade skapat en egen metod för vimo och skapat en metod för att hämta ut en mediaId och anropat båda de metoderna istället, för just nu heter metoden GetYoutubeId vilket inte är sant längre.

gjorde en ASP regexp testare för många år sedan och tagit referenserna från Vide (webeye.nu, och detta har varit OK från honom): http://voigt.se/sandbox/regexp/

Medlem sedan nov. 2001402 inlägg
#37

Tack, bra testarlänk. Det där kommer jag behöva läsa fler gånger för att förstå fullt ut känner jag.

Ja visst heter den "fel" med getyoutubeid men det är ju egentligen bara att köra search and replace och byta ut namnet till getvideoid. :)

263 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
131 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
132 ms — ändringar (db)