[PHP] Regex Youtube-tag met extra regel

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • HyperioN
  • Registratie: April 2003
  • Laatst online: 24-05 15:42
Reguliere expressies vind ik nog steeds een van de moeilijkste dingen om goed te begrijpen..
Daarom wil ik even jullie hulp inschakelen.

Ik heb een stuk tekst en daarin staan Youtube-tags; die wil ik eruit halen zodat ik die kan gebruiken.
Voorbeeld van de tekst:
code:
1
2
3
4
5
6
7
blabla wat tekst hier.
[youtube]sIzxmG8-r88[/youtube]
Getting started

[youtube]TIg877BATK0[/youtube]
what is in the box?
blabla nog wat tekst hier.


Nu is het zoeken van de youtube-tag niet zo moeilijk:
PHP:
1
preg_match_all('/\[youtube\](.+?)\[\/youtube\]/s',$text,$matches);

Hiermee haal ik mooi het Youtube-id uit de tag (en met preg_replace kan ik de hele tag gemakkelijk verwijderen):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Array
(
    [0] => Array
        (
            [0] => [youtube]sIzxmG8-r88[/youtube]
            [1] => [youtube]TIg877BATK0[/youtube]
        )

    [1] => Array
        (
            [0] => sIzxmG8-r88
            [1] => TIg877BATK0
        )

)

Echter; helaas staat op de volgende regel ná de youtube-tag nog de titel/omschrijving van de video. En die wil ik dus ook graag parsen.
En daar kom ik dus niet uit; ik heb uiteraard gegoogled en kom wel wat dingen tegen zoals
PHP:
1
preg_match_all('/\[youtube\](.+?)\[\/youtube\](.*?)\n/sU',$text,$matches);


maar daar komt dit uit :
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Array
(
    [0] => Array
        (
            [0] => [youtube]sIzxmG8-r88[/youtube]
Getting started

[youtube]TIg877BATK0[/youtube]
what is in the box?

        )

    [1] => Array
        (
            [0] => sIzxmG8-r88[/youtube]
Getting started

[youtube]TIg877BATK0
        )

    [2] => Array
        (
            [0] => 
what is in the box?
        )

)

Dus "what is in the box" wordt dan wel goed gevonden maar de rest niet.

Uiteindelijk wil ik dus zoiets:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Array
(
    [0] => Array
        (
            [0] => [youtube]sIzxmG8-r88[/youtube]
                      Getting started
            [1] => [youtube]TIg877BATK0[/youtube]
                      what is in the box?
        )

    [1] => Array
        (
            [0] => sIzxmG8-r88
            [1] => TIg877BATK0
        )

    [2] => Array
        (
            [0] => Getting started
            [1] => what is in the box
        )
)

Dus de youtube-id's in matches[1] en de titel in matches[2]

Samenvatting:
Ik zoek een regex-mogelijkheid om de inhoud van youtube-tag te verkrijgen maar ook de eerste regel die daaronder staat.

Thx :)

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Misschien is het handig, als je regexen moeilijk vindt, om even stapje-voor-stapje jezelf proberen de stof eigen te maken. Er zijn zat websites met tutorials en overzichten van regex-syntaxes etc. om mee aan de gang te gaan. Wat voor mij erg goed helpt is een (dergelijke) tool als Regex Designer om met je regex te spelen totdat 'ie goed is en doet wat je wil dat 'ie doet.

Maar uiteindelijk zal in dit topic een onvermijdelijke Jamie Zawinski quote aangehaald worden, mark my words ;)

[ Voor 38% gewijzigd door RobIII op 02-04-2012 13:35 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

RobIII schreef op maandag 02 april 2012 @ 13:33:
Maar uiteindelijk zal in dit topic een onvermijdelijke Jamie Zawinski quote aangehaald worden, mark my words ;)
Gek, maar ik vind
Every program attempts to expand until it can read mail. Those programs which cannot so expand are replaced by ones which can.
niet echt van toepassing hier hoor :?

:+



Voor de rest volledig eens met RobIII :) Heb je al naar andere mogelijkheden gekeken dan een regular expression?

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
BtM909 schreef op maandag 02 april 2012 @ 13:36:
[...]

Gek, maar ik vind

[...]

niet echt van toepassing hier hoor :?

:+
Nee, maar 1 van z'n andere quotes wel ;) (Hoewel er discussie is of die quote nou eigenlijk wel van hem vandaan komt of niet; either way: Jamie Zawinski en Regular Expressions zijn voor eeuwig aan elkaar verbonden, ook al was 't misschien niet zijn quote ;) )

[ Voor 26% gewijzigd door RobIII op 02-04-2012 13:44 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 15:23
Youtube heeft ook gewoon een API. Als je het film id weet kan je zo een XML ophalen met alle informatie van de video inclusief tags. Dan weet je dat het later ook nog gaat werken. Je regexp kan nu nog op de site werken, maar later niet meer na een redesign ofzo.

http://gdata.youtube.com/feeds/api/videos/xqKPe9w5bUs

edit:

Ik zie nu dat je een stuk tekst hebt met youtube informatie. Dat hoeft inderdaad niet te betekenen dat het op de youtube site staat. My bad :) Sterker nog, met youtube tags bedoelde je geen tags die bij een video horen. whoops.

[ Voor 28% gewijzigd door ZpAz op 02-04-2012 13:59 ]

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

En als het toch met een regexp moet: zoek eens naar de dotall- en multiline modifiers.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:47

Creepy

Tactical Espionage Splatterer

Maar als je [youtube]TIg877BATK0[/youtube] steeds op 1 regel hebt staan dan is dat er ook makkelijk zonder regexp uit te vissen.Met wat string zoekfuncties per regel is dat prima uit ze zoeken.
En als je dan al weet dat je net een youtube video hebt opgepakt, dan weet je ook dat je bij de volgende regel direct de omschrijving hebt.
Verkapte/verplicht post i.v.m. met onderschrift :P

[ Voor 8% gewijzigd door Creepy op 02-04-2012 14:03 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • HyperioN
  • Registratie: April 2003
  • Laatst online: 24-05 15:42
BtM909 schreef op maandag 02 april 2012 @ 13:36:
[...]
Voor de rest volledig eens met RobIII :) Heb je al naar andere mogelijkheden gekeken dan een regular expression?
Ik sta open voor alle ideeën.. ik heb zo zelf geen idee hoe dit anders te doen dan met een reguliere expressie?
Tsja, wellicht iets met de positie zoeken van de youtube-closetag, en een newline character skippen en dan lezen tot aan het volgende newline character. Maar dat lijkt me een stuk omslachtiger dan een mooie regex?

Let wel; het betreft hier informatie die ik aangeleverd krijg, en die ik dus niet kan wijzigen. Ik ben het eens met ZpAz dat dit mooier op te lossen zou zijn, maar zo'n feest is het helaas niet.

Overigens is het ook zeker zo dat ik de regex-stof eigen wil maken. Maar ik ben meer een "al doende leert men"-type, dus ik zoek liever in een praktijk-situatie oplossingen voor hetgeen ik dan tegenaan loop, dan dat ik in mijn vrije tijd regex-tutorials ga doen.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
HyperioN schreef op maandag 02 april 2012 @ 14:04:
[...]
Tsja, wellicht iets met de positie zoeken van de youtube-closetag, en een newline character skippen en dan lezen tot aan het volgende newline character. Maar dat lijkt me een stuk omslachtiger dan een mooie regex?
Als je het bestand eens regel voor regel verwerkt zoals Creepy aangeeft, dan hoef je alleen maar te kijken of een regel begint met [youtube] en daar haal je dan 't ID uit en de volgende regel is automatisch je omschrijving.

[ Voor 14% gewijzigd door RobIII op 02-04-2012 14:06 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • HyperioN
  • Registratie: April 2003
  • Laatst online: 24-05 15:42
Creepy schreef op maandag 02 april 2012 @ 14:03:
Maar als je [youtube]TIg877BATK0[/youtube] steeds op 1 regel hebt staan dan is dat er ook makkelijk zonder regexp uit te vissen.Met wat string zoekfuncties per regel is dat prima uit ze zoeken.
En als je dan al weet dat je net een youtube video hebt opgepakt, dan weet je ook dat je bij de volgende regel direct de omschrijving hebt.
Verkapte/verplicht post i.v.m. met onderschrift :P
Das eigenlijk wel een heel goeie tip :) thnx

Acties:
  • 0 Henk 'm!

  • HyperioN
  • Registratie: April 2003
  • Laatst online: 24-05 15:42
Oké ik heb het nu zo opgelost :-)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function str_filter_youtubetags($text) {
    $nextlineismytitle = false;
    $youtubeids = array();
    $youtubetitles = array();
    $lines = explode("\n",$text);
    
    foreach($lines as $key => $line){
        if(substr($line,0,9)=="[youtube]") {
               $youtubeids[] = substr($line,9,-11); //start-tag is 9 tekens lang, end-tag is 10 tekens lang
               $nextlineismytitle = true; //volgende regel is de omschrijving
               unset($lines[$key]); //deze regel verwijderen
               continue;
        }
        if($nextlineismytitle) {
               $youtubetitles[] = $line;
               unset($lines[$key]); //deze regel verwijderen
               $nextlineismytitle = false;
        }
    }
    $strippedtext = implode("\n",$lines);
    return array($strippedtext,$youtubeids,$youtubetitles);
}

Deze returnt een array met de nieuwe tekst waarin de youtube-regels weg zijn; en twee arrays met resp. de youtube-id's en de titel uit de tekst :-):

input:
code:
1
2
3
4
5
6
7
8
Met deze basis experimenteerdoos willen we je op een veilige, toffe, en educatieve manier vertrouwd maken met elektronische schakelingen die vandaag nog steeds de grondslag vormen van onze hypermoderne elektronica.

[youtube]sIzxmG8-r88[/youtube]
Getting started

[youtube]TIg877BATK0[/youtube]
what is in the box?
Deze bouwdoos voorziet je van alle noodzakelijke componenten, en een experimenteerbord, "breadboard" genaamd, om meteen te kunnen beginnen en in enkele minuten je eerste schakeling te bouwen.


Output:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Array
(
    [0] => Met deze basis experimenteerdoos willen we je op een veilige, toffe, en educatieve manier vertrouwd maken met elektronische schakelingen die vandaag nog steeds de grondslag vormen van onze hypermoderne elektronica.


Deze bouwdoos voorziet je van alle noodzakelijke componenten, en een experimenteerbord, "breadboard" genaamd, om meteen te kunnen beginnen en in enkele minuten je eerste schakeling te bouwen.
    [1] => Array
        (
            [0] => sIzxmG8-r88
            [1] => TIg877BATK0
        )

    [2] => Array
        (
            [0] => Getting started
            [1] => what is in the box?
        )

)


Daar kan ik wel wat mee :).
Thnx voor de tips.. Ben nog steeds van mening dat dit ook vast met een regeltje regex had gekunnen, maar goed :+
Begrijp ik dus goed dat jullie eigenlijk vinden "gebruik alleen regex als er echt geen andere manier is" ?

Acties:
  • 0 Henk 'm!

  • Amras
  • Registratie: Januari 2003
  • Laatst online: 20-09 14:15
HyperioN schreef op maandag 02 april 2012 @ 14:41:
Begrijp ik dus goed dat jullie eigenlijk vinden "gebruik alleen regex als er echt geen andere manier is" ?
Test het zelf: schrijf eens een creatieve regex en probeer over een aantal maanden te begrijpen wat het kreng doet. ;)

Je huidige regex is overigens niet heel spannend, dus daar gaat het misschien niet direct voor op.

Acties:
  • 0 Henk 'm!

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 17-09 11:07

TheNephilim

Wtfuzzle

Stackparsers zijn een andere oplossing, maar waarom doe je niet [youtube=TIg877BATK0]beschrijving[/youtube]? Dat zou het al veel makkelijker maken dan te gaan klooien op vokgende regel enzo.

Owh, ik begrijp dat het een bestaand stuk tekst is... :P
Pagina: 1