login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Regex (Opgelost)

Offline Esli - 11/08/2011 13:51 (laatste wijziging 11/08/2011 13:52)
Avatar van EsliPHP interesse Hallo,

Ik heb momenteel een simpele template parser gemaakt die doet wat hij moet doen. Nu zou ik er toch nog een kleine toevoeging aan willen doen, waardoor ik werkelijk alle HTML zou kunnen scheiden van mijn PHP-code.

Nu, ik écht onhandig met regexxen en kom er niet bepaald goed uit. Ik ben momenteel wat aan het testen, maar het lukt me niet helemaal. Mijn bedoeling is dat de volgende syntaxis wordt gebruikt: (voorbeeldje)

  1. {$FOREACH_USERS@username@mail@gsm}
  2. 'Username: {@username} mail: {@mail} gsm: {@gsm} <br />
  3. {$FOREAH_USERS}


  1. <?php
  2. /* in PHP zou ik dat dan als volgt doen */
  3. $oTemplate->addForeach('foreach_users', array('usern' => 'Write', 'mail' => 'spam@spam.spam', 'gsm' => '0000000001'));
  4.  
  5. /* Uiteraard met meer dan 1 user */
  6. ?>


Ik ben alvast de volgende regex uitgekomen:
/{\$([A-Z0-9_-]+)@([A-Z0-9_-]+)}(.+?)\{\$([A-Z0-9_-]+)}/s

Nu, dat is nog niet helemaal wat ik wil. Momenteel kan er maar 1x @ gebruikt worden. Terwijl dit eigenlijk ongelimiteerd x zou moeten lukken.

5 antwoorden

Gesponsorde links
Offline Martijn2008 - 12/08/2011 23:39
Avatar van Martijn2008 PHP beginner Er zijn al opensource template parsers beschikbaar die je gratis kunt downloaden, zie TemplatePower en Smarty. Waarom zou je er zelf 1 willen maken?
Offline Esli - 13/08/2011 13:37
Avatar van Esli PHP interesse @Martijn,

Ik begrijp je reactie, maar ik vind ze onnodig. Moest ik een open source gebruiken, dan zou ik de vraag niet stellen. Ik ben van mening dat die open source oplossingen te uitgebreid zijn, mijn applicatie onnodig groot & ingewikkeld maken. Ik heb al die mogelijkheden niet nodig. En tot slot, het is toch altijd leuk het zelf even te proberen :-).

Maar goed, ik vind vast wel een oplossing.
Offline ThAlmighty - 13/08/2011 15:22
Avatar van ThAlmighty HTML beginner Je moet eerst checken op je {$FOREACH} string met een preg_match() functie, wanneer die juist is bevonden moet je daarna een preg_match_all() functie doen om de parameters te parsen.

Tip: gebruik voor makkelijk patronen geen regexp, maar bijvoorbeeld explode().


  1. <?php
  2. $str = '{$FOREACH_USERS@abc@def@ghi}';
  3. if(preg_match('/{\$FOREACH_([^@]+)([^}]+)}/', $str, $foreach_m) == true){
  4. $name = $foreach_m[1];
  5. $params = explode('@', $foreach_m[2]);
  6. array_shift($params);
  7.  
  8. // Nu heb je alles
  9. // ......
  10. }
Bedankt door: Esli
Offline Esli - 15/08/2011 01:17
Avatar van Esli PHP interesse Bedankt, ik heb het uiteindelijk nog iets anders gedaan. Met een structuur die ik wat handiger vond:

  1. {LOOP@START}
  2. <tr><td>{@KEY1}</td><td>{$KEY2}</td></tr>
  3. {LOOP@STOP}


Op die manier was het iets logischer, al blijft de methode die ThAlmighty eigenlijk exact hetzelfde.
Offline Thomas - 15/08/2011 02:01
Avatar van Thomas Moderator Ik snijd hiermee waarschijnlijk een eindeloos terugkerende eindeloze discussie aan, waar geen partij het ooit over eens zal worden, maar misschien is het toch interessant om er eens over na te denken: Vaak (?) worden dit soort constructies bedacht om ontwikkelaars (denk aan designers) of gebruikers (beperkt) toegang te geven tot een bepaald deel van code/functionaliteit/whatever. Ook om designers niet bloot te stellen aan code (het lezen en begrijpen van PHP code schijnt besmettelijk te zijn!) of ervoor te zorgen dat deze geen onherroepelijke schade aan te richten aan code die niets met design te maken heeft of wat dan ook. Dus wordt er een soort van gelimiteerde pseudo-taal ontwikkeld waarmee blokken en loops gesimuleerd worden. Maar als je goed kijkt, is dit hetzelfde als wat PHP al voor je regelt, alleen het is een ander "dialect". Wat mensen die deze pseudo-taal gebruiken moeten doen is deze leren. Wat is er op tegen om hun vertrouwd te maken met de eenvoudigste bouwstenen van PHP? PHP verandert niet zo snel, een pseudo-taal mogelijk wel (daar dit geen standaardenzijn). Nu zeg ik niet dat je geen template-engine mag gebruiken of ontwikkelen, ik vind TemplatePower nog steeds een prima compromis voor bepaalde gevallen. Ik denk echter niet dat je het jezelf als ontwikkelaar van zo'n pseudo-taal of als gebruiker van zo'n pseudo-taal het volgende uit het oog moet verliezen: voegt mijn template-engine iets toe / maakt het bepaalde dingen echt eenvoudiger of is het slechts een andere manier om dezelfde dingen te zeggen die in PHP al beschikbaar zijn / heb ik een template-engine nodig voor wat ik aan het ontwikkelen ben? / Is het wellicht beter dat de mensen die hiermee werken gewoon wat basis PHP leren om te herkennen wat het effect van code is (want hetzelfde moet je doen bij zo'n pseudo-taal)?

Maar voel je vrij om te experimenteren . Naar mijn mening heeft in ieder geval TemplatePower een zekere toegevoegde waarde (ook al maakt deze zich ook schuldig aan het nabootsen van PHP-code), die bepaalde dingen echt eenvoudiger maakt. Om nu te zeggen dat deze "onnodig" zijn vind ik een beetje kort door de bocht, tenzij je geprobeerd hebt hiermee iets te maken wat daarmee niet makkelijk lukte. Ik durf echter te wedden dat men ook best zonder template engines kan omdat PHP alles zelf al kan. Zie bijvoorbeeld het bovenstaande stuk code van Esli; dit is een 1-op-1 vertaling van een for-loop. Waarom zou je hier een compleet nieuwe syntax voor bedenken?

Meh, just my 2c.
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.2s